# Signicat developer documentation
> Welcome to the Signicat developer documentation, your gateway to unlocking the future of digital identity solutions.
This file contains all documentation content in a single document following the llmstxt.org standard.
## Signicat APIs
:::info How to connect to Signicat APIs
To learn how to set up a connection to any Signicat API and start making requests, see our **Connecting to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::
## Product APIs
Our product APIs deliver core functionality for Signicat products. You can explore the API reference documentation for our products using the buttons below:
### Data Verification
Verify customer data against different national and commercial data sources.
* [**Data Verification API**](/apis/data-verification/): Verify information about natural persons or organisations
### Digital Evidence Management (DEM)
Store transactional data or consent messages.
* [**Digital Evidence Management API**](/apis/digital-evidence-management/): Securely capture, store and manage audit trail data
### eID and Wallet Hub
Manage authentications with eIDs and wallets with the Signicat Authentication REST API.
* [**Authentication REST API**](/apis/eid-hub/): Manage end-user authentications using our Authentication REST API
### Electronic Signing
Create electronic signatures on contracts, declarations, forms and other documents.
* [**Sign API v2**](/apis/electronic-signing/sign-api-v2/): Electronic signatures for both small to medium sized businesses and those within regulated industries
* [**Enterprise Sign API**](/apis/electronic-signing/enterprise/): Electronic signatures for businesses within regulated industries
* [**Express Signature API**](/apis/electronic-signing/express/): Electronic signatures for small to medium-sized businesses
* [**Signicat Archive**](/apis/archive/): Securely store and retrieve signed documents
### ID Document and Biometric Verification
Perform electronic identity verification (eIDV) with Assure API.
* [**Assure API**](/apis/id-document-and-biometric-verification/): Perform electronic identity verification (eIDV) on end-users using our Assure REST API
### MobileID
Implement strong customer authentication on mobile devices.
:::note Want to use our next-generation API?
The [ReuseID API](/apis/reuseid/) is our next-generation API for ReuseID services, including MobileID.
- We recommend this for all customers, so that you can utilise the latest capabilities and improvements.
- For existing customers, it is possible to use ReuseID and MobileID in parallel.
:::
* [**MobileID API**](/apis/mobileid/): Manage identities and carry out mobile authentication operations
* [**MobileID Admin API**](/apis/mobileid-admin/): Manage and administer your MobileID account
### Ongoing Monitoring
Monitor changes to the identifying data of natural persons and organisations over time.
* [**Person Monitoring API (Deprecated)**](/apis/person-monitoring/): Monitor information on natural persons over time
* [**Ongoing Monitoring API**](/apis/ongoing-monitoring/): Monitor information on natural persons and organisations over time
### ReuseID
Build your own reusable identities with ReuseID.
* [**ReuseID Onboarding API**](/apis/reuseid-onboarding/): Use ready-made flows to onboard ReuseID identities and perform step-up operations
* [**ReuseID API**](/apis/reuseid/): Manage identities and carry out ReuseID authentication operations
### Secure Share
Create, manage and secure the files you share with others.
* [**Secure Share API**](/apis/secure-share/): Share files securely with other people
### Signicat Mint
Build custom business workflows and simplify your user journeys with a no-code platform.
* [**Signicat Mint API**](/apis/mint/): Manage your flows and analyse your user journey reports
### User management
Manage your end-users and create reusable identities globally with Signicat IAM.
* [**Signicat IAM SCIM API**](/apis/siam/): Manage identity and access management for your platform
## Management APIs
Our management APIs allow you to programmatically manage configurations that are typically handled in the Signicat Dashboard. You can explore the API reference documentation for managing configurations using the buttons below:
:::note Note
Our management APIs are not fully supported or covered by the same service-level agreements (SLAs) and uptime as our product APIs. This means that although they are maintained and functional, they are intended for developers who are looking to tackle a particular corner case, such as a custom integration.
:::
### Audit logs
* [**Signicat Audit API**](/apis/audit-logs/): Query, view and filter activities in the audit logs
### Account management
* [**Signicat Account Management API**](/apis/account-management/): Manage your organisations, accounts, and company information. Download invoices
### Domain management
* [**Signicat Domain Management API**](/apis/domain-management/): Manage the domains for your account
### Events management
* [**Signicat Events Management API**](/apis/events/): Create and manage subscriptions to events published by Signicat services
### OIDC Configuration API
* [**OIDC Configuration API**](/apis/oidc-config/): Manage your OIDC client configuration (Advanced)
### Usage analytics
* [**Signicat Usage API**](/apis/usage/): View analytics and insights on your API usage to track and optimise performance
---
## Access management
We offer Identity and Access Management (IAM) control so that you can manage user profiles and assign them roles.
To learn how to do this, see the guides below:
* [**Managing roles and permissions**](/docs/dashboard/access-management/managing-roles-and-permissions): Assign roles and administer access to the Signicat Dashboard
* [**Managing users**](/docs/dashboard/access-management/managing-users): Manage users for your organisation in the Signicat Dashboard
---
## Managing roles and permissions
When inviting new users (for example your team members) to join your organisation, you specify what roles to assign to them based on what tasks they are responsible for.
This page is relevant to you if you are an administrator in the Signicat Dashboard. You can administer who has access to your accounts and organisations in the Signicat Dashboard and what permissions they have.
:::info Try it in the Signicat Dashboard
To manage access rights in the Signicat Dashboard, go to **Signicat Dashboard** > [**Access Management**](https://dashboard.signicat.com/ownidp-management/).
:::
## About roles and permissions
Roles are groups of permissions that you can assign to users or API/machine clients (we refer to these entities collectively as _principals_).
Permissions allow principals to perform specific actions on Signicat resources, such as the ability to access an API, view invoices or invite other users. To make permissions available to principals, you grant roles to the principals.
We divide roles into the following basic types:
:::CustomTable{columnWidths="15% 15% 15% 55%"}
| Basic role | Request method | Action | Permissions |
|:-----------|:---------------|:-------|:------------|
| **Viewer** | GET | `read` | Permissions for read-only actions that do not affect state, such as viewing (but not modifying) existing resources or data. |
| **Writer** | POST | Action tags | Permissions for write-only actions, but not read or update. An example for this is in Digital Evidence Management (DEM), where a service can create DEM records but not update, delete or read them. |
| **Editor** | PUT/CREATE/DELETE | `create` `update` `delete` | All viewer permissions, *plus* permissions for actions that modify state, such as changing existing resources. |
| **Admin** | All + Invite users | `*` (all) | All Editor permissions, *plus* permission to invite, remove and grant access to users. |
:::
A role contains one or more _permissions_, which offer a granular way of specifying rights. There can be multiple roles with the same permissions.
:::note Organisation and Account Admin
An `Organisation Admin` has all the permissions for the organisation, and all the accounts belonging to that organisation.
An `Account Admin` has all the permissions for a given account but not for the overlying organisation.
Some roles apply to a particular product or service, whereas the `Organisation Admin` role has access to all products in the Signicat Dashboard.
:::
## Which roles to assign
You control users access to resources with roles. In the following table, you can find some recommendations for common scenarios.
:::CustomTable{columnWidths="20% 20% 40% 20%"}
| User type | Role | Details | Scope* |
|:-----------------|:------------------|:----------------|:------|
| Commercial owner | `Organisation Admin` | Access to create/update/delete accounts and configurations. Can invite/edit/delete users on the Organisation and child accounts. Gives billing rights to purchase products on Signicat Marketplace. | Organisation level |
| Main technical owner | `Organisation Admin` | Same rights as Commercial owner. | Organisation level |
| Financial owner | `Usage Viewer` | Access to view usage and invoices. | Organisation level |
| Developer/Technical consultant | `Account Admin` | Access to update account and account configurations. Allowed to invite users and remove users not inherited from parent Organisation. | Account level |
| Support roles | `Support Editor` | Access to create, update and view support tickets and comments, including sensitive data. | Organisation level |
:::
\* Lowest level where you can grant the role.
## Assign roles
You give access to resources by assigning specific roles to users and API/machine clients (collectively referred to as principals). You can also control the scope by deciding whether to assign a role at the organisation or account level.
You can assign, edit or remove roles to a principal in the Signicat Dashboard. To grant access to an existing principal, do the following:
1. In the Signicat Dashboard, navigate to **Access Management** > [**Permissions**](https://dashboard.signicat.com/ownidp-management/permissions).
2. Hover over the row of a principal and select **Edit**.
3. In the "Edit access" menu, edit the roles of a principal in one of the following ways:
- To add a role, select **+ Add** and select a role.
- To edit an existing role, select **Change** in the field of a role and select a new role.
- To remove a role, select the trash bin icon next to a role.
4. Click **Save** to apply the changes.
:::tip Note
Users must log in again to view and use a new role.
:::
## Invite members
To invite a principal from another organisation or account and grant them access within the scope of your selected organisation or account, do the following:
1. In the Signicat Dashboard, navigate to **Access Management** > [**Permissions**](https://dashboard.signicat.com/ownidp-management/permissions).
2. Select **Grant access** in the top right.
3. In the "Grant access" form, configure:
:::CustomTable{columnWidths="20% 80%"}
| Attribute | Description |
|----------------|-------------|
| **Scope** | Required. The organisation or account that the role applies to. |
| **Principals** | Required. The user, domain or API/machine client for which you want to change access rights. |
| **Roles** | Required. Browse available roles in the "Recommended", "By category" or "All available" tabs. Select at least one role. |
:::
4. Click **Save** to apply the changes.
:::tip Note
Users must log in again to view and use a new role.
:::
## Usage guidelines
You can view, search and sort roles in the **Dashboard** > **Access Management** > [**Roles**](https://dashboard.signicat.com/ownidp-management/roles).
To view the details and definition of a role, do the following.
1. Go to **Access Management** > [**Roles**](https://dashboard.signicat.com/ownidp-management/roles).
2. Here, select the role name, for example "Account Admin".
3. In the "Account Admin" page, you can view the following fields:
- Name: The name of the role
- Id: Identifier of the role
- Description: Additional information explaining the role function.
- Category: The class a role belongs to.
- Permissions: A list of all permissions associated with the role.
## Remove access
To remove access for a principal:
1. Go to **Access Management** > [**Permissions**](https://dashboard.signicat.com/ownidp-management/permissions).
2. Hover over the row of the principal you want to remove access for and click **Edit**.
3. In the "Edit access" overview, click **Remove access**. On the confirmation dialog, approve the changes to remove all the roles assigned to the principal.
4. To only remove access for specific roles, select the bin icon next to a role in the **Roles** section. Then, **Save** at the bottom of the "Edit access" overview.
## Advanced information
### Roles hierarchy
Assigning a role to a user for a specific account or organisation impacts the way a user can access resources at the account or organisation level.
Imagine you have configured the following in the Dashboard:
:::note Example configuration
- Organisation 1
- Account A
- Account B
- Organisation 2
- Account C
:::
**Scenario 1**
If a user is assigned role X on _Organisation 1_, they will also receive the same role for any sub-level, such as _Account A_ and _Account B_. The user will not receive any role on _Organisation 2_ or _Account C_.
**Scenario 2**
If a user is assigned role X on _Account A_, they will not receive the same role for _Organisation 1_ and _Account B_.
Granting access at the account level limits user access to the resources of the account.
## Tutorial video
This video shows you how to invite users, set roles and set permissions in the Signicat Dashboard.
---
## Managing users
This page explains how to invite a person to your organisation, configure their access, and remove an existing user.
When you invite a new user to join your organisation, you can control user access by [assigning specific roles](/docs/dashboard/access-management/managing-roles-and-permissions.mdx). The permissions you grant to users in your organisation determine the features they can use through Signicat products and services.
:::info Try it in the Signicat Dashboard
To manage the users in your Signicat organisation, go to **Signicat Dashboard** > **Access Management** > [**Users**](https://dashboard.signicat.com/ownidp-management/users).
:::
## Inviting users
As an `Organisation Admin` or `Partner Organisation Admin`, you can manage users within your organisation(s). You can invite a person to join your organisation using the Signicat Dashboard.
:::warning Note
Machine clients and applications are excluded from the flow to invite a user. See our page on [Managing roles and permissions](/docs/dashboard/access-management/managing-roles-and-permissions.mdx) to find out how to grant access to machine clients and applications.
:::
### Prerequisites
- You must have the `Organisation Admin` or `Partner Organisation Admin` role to invite users to an organisation.
- `Account Admin` roles are only allowed to invite and remove users at the account level, that are not inherited from a parent organisation.
### Invite a new user
To invite a new user to your organisation:
1. Log in to the [Signicat Dashboard](https://dashboard.signicat.com).
2. Go to **Access Management** > [**Users**](https://dashboard.signicat.com/ownidp-management/users) and select **Invite users**. Alternatively, you can select **Invite peers to Organisation** in the Dashboard homepage.
3. In the invitation form, fill in:
:::CustomTable{columnWidths="20% 80%"}
| Attribute | Description |
|--------------------|-------------|
| **Email** | Required. The email address where to send the invitation. If the user already exists, they receive an email with a prompt to accept access to the new role(s) you assigned them. |
| **First name** | Optional. The first name of the user. Specify a value to prefill the user registration form. The user can override this value during registration. |
| **Last name** | Optional. The last name of the user. Specify a value to prefill the user registration form. The user can override this value during registration. |
| **Organisation** | Required. The name of the organisation for which you want to give access. |
| **Account** | Optional. Add the name of an account only if you want to limit access to a specific account. Leave the field empty to grant access to all accounts under the organisation. |
| **Roles** | Required. To add a role select the **+ Add** button and pick the role(s) you want to grant to the user. Browse the "Recommended", "By category" or "All available" tabs to find a role. You can learn more about roles in the [Which roles to assign](/docs/dashboard/access-management/managing-roles-and-permissions.mdx#which-roles-to-assign) section on our page on [Managing roles and permissions](/docs/dashboard/access-management/managing-roles-and-permissions.mdx). |
:::
4. Click **Send invite** to invite the user. The person you invited will receive an email with instructions to sign up and accept the invite. Invitations expire after three days.
### Examples
:::details User invitation settings for Marketplace
To purchase products on Signicat Marketplace, you need billing access. To invite a user that can buy products, specify the following settings:
- **Account**: Leave empty
- **Roles**: `Organisation Admin`
:::
## Removing users
To permanently delete the profile of a user in your organisation, you need to contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
As an alternative, you can remove all access for a user. To do this:
1. Log in to the [Signicat Dashboard](https://dashboard.signicat.com).
2. Browse to **Access Management** > [**Permissions**](https://dashboard.signicat.com/ownidp-management/permissions).
3. Hover over the row of the user you want to remove access for and click **Edit**.
4. In the "Edit access" overview, click **Remove access**. On the confirmation dialog, approve the changes to remove all the roles assigned to the user.
Now, the user cannot view or access any of the services in your organisation, including viewing the name of your organisation and accounts. Changes apply immediately.
Learn more about roles and permissions on our page on [Managing roles and permissions](/docs/dashboard/access-management/managing-roles-and-permissions.mdx).
## Tutorial video
This video shows you how to invite users, set roles and set permissions in the Signicat Dashboard.
---
## Billing and analytics
We offer billing and analytics tools so that you can manage your invoices and transactions.
To learn how to do this, see the guides below:
* [**Invoices**](/docs/dashboard/billing-and-analytics/invoices): Learn how to use the Signicat Invoices service
* [**Transactions**](/docs/dashboard/billing-and-analytics/transactions): Learn how to use the Signicat Transactions service
---
## Invoices
The Signicat **Invoices** service provides you with information about all invoices and their details for a selected organisation, if the information is available.
The list also indicates if a correction has been sent to you. This is shown on the list item containing the invoice.
:::info Try it in the Signicat Dashboard
To manage invoices in the Signicat Dashboard, go to **Signicat Dashboard** > **Billing and Analytics** > [**Invoices**](https://dashboard.signicat.com/invoices).
:::
## How does the Invoices service work?
### Get started
You can view invoices for your organisation in the Signicat Dashboard. To do this:
1. Log in to the [Signicat Dashboard](https://dashboard.signicat.com).
2. Navigate to the [**Invoices**](https://dashboard.signicat.com/invoices) service.
:::tip Where can I find the Invoices service?
From the Signicat Dashboard, you can access the Invoices service in two ways:
- Under the **Management** heading, click **Invoices**.
- In the left-side menu, expand the **Billing & Analytics** dropdown menu, then click **Invoices**.
:::
### Available information
The information that is available to you in the Signicat Dashboard depends on how your organisation is set up. Either:
- The organisation is the receiver of its invoices.
- The organisation is configured with a parent organisation. In this case, the parent organisation is the receiver of the invoices.
:::tip Want to learn more?
You can read more about how organisations and accounts work on the [Organisation management](/docs/dashboard/organisation-management/) documentation.
:::
#### Organisation
:::note What does this apply to?
The following applies to organisations where:
- The organisation is set as the billing account.
- The organisation receives their own invoices.
:::
All invoices for the organisation are listed on the invoices overview page.
For the period of time up until when an invoice is generated and sent to you, you can see a draft of the invoice with the listed transactions. During this period, the list item will be marked with the status **Draft**.
#### Account
:::note What does this apply to?
The following applies to accounts where:
- Its organisation is set as the billing account.
:::
All invoices for the account's organisation are listed on the invoices overview page.
All accounts under the organisation will show the same invoices in this section, as invoices are linked to the organisation.
For the period of time up until when an invoice is generated and sent to you, you can see a draft of the invoice with the listed transactions. During this period, the list item will be marked with the status **Draft**.
#### Parent organisation
:::note What does this apply to?
The following applies to organisations where:
- The parent organisation is set as the billing account.
:::
All invoices for the parent organisation in addition to all invoices for its child organisations are listed on the invoices overview page.
For the period of time up until when an invoice is generated and sent to you, you can see a draft of the child accounts' invoices with the listed transactions. During this period, the list item will be marked with the status **Draft**.
#### Child organisation
:::note What does this apply to?
The following applies to organisations where:
- Its parent organisation is set as the billing account.
:::
No invoices or invoice drafts will be shown on the invoices overview page.
### Sorting invoices
By default, invoices are listed in reverse chronological order. This means that the invoice generated most recently is at the top of the list.
You can sort the list of invoices using the following parameters:
- Date
- Reference
- Amount
- Status
To do this:
1. Navigate to the column heading that you want to sort the invoices with.
2. Click the arrows icon beside the heading to sort in ascending or descending order.
### Filtering invoices
You can filter invoices by date and status. to do this:
1. On the invoices overview page, click the **Filter** button.
2. Use the tick boxes to apply **Date** and **Status** filters:
- If you select **Date**, then you are prompted to set a desired time period.
- If you select **Status**, then you are prompted to set desired statuses.
3. Click **Apply** to confirm your choices.
## What does an invoice look like?
Each line has the information below:
:::CustomTable{columnWidths="25% 75%"}
| **Data field** | **Description** |
| :--- | :--- |
| Date | The date when the invoice is sent. |
| Reference | The reference of the invoice. |
| Amount | The total amount of the invoice. **Note**: Any corrections will also be displayed here. |
| Status | Indicates whether the invoice has been invoiced, or if it only has a _Draft_ status. |
:::
### Invoice statuses
To learn about what the different invoice statuses mean, see the table below:
:::CustomTable{columnWidths="25% 75%"}
| **Status** | **Description** |
| :--- | :--- |
| Invoiced | The billing account has received its invoice. |
| Draft | The billing account can see a draft which includes the usage so far for that period. With this status, the invoice is not generated or sent. |
:::
### Invoice details
To see the details for a particular invoice, you must select it from the list of invoices. Once you have done this, you can view the following fields:
:::CustomTable{columnWidths="25% 75%"}
| **Data field** | **Description** |
| :--- | :--- |
| Product name | The name of the product being used from Signicat. **Example**: Norwegian BankID High - Authentications |
| Period | The time period of usage for which you are being invoiced. |
| Quantity | The number of transactions in the given time period. |
| Unit price | The price per transaction. |
| Total amount | The total price for all usage. |
| Usage data | An expandable field which shows a breakdown of information for the method. **Note**: If you are not migrated to our new platform, then the breakdown will differ with a separate *Usage* section. |
:::
#### Usage data
Once you have expanded the usage data field, you can view the following fields which provide a breakdown of information for the method:
:::CustomTable{columnWidths="25% 75%"}
| **Usage data field** | **Description** |
| :--- | :--- |
| Endpoint name | The name of the endpoint used for the transaction. |
| Method name | The name of the method used. **Example**: nbid |
| Profile | The name of the theme used. **Note**: This field can be empty. |
| Count type | The type of transaction that is counted. This is given as one of the following states: *Started*, *Completed* or *Loaded*. **Note**: *Cancelled* is not classified as unique state; it is counted as the *Started* state. For more information about the different states, see our [Transactions](/docs/dashboard/billing-and-analytics/transactions.mdx#what-does-a-transaction-look-like) documentation. |
| Quantity | The total number of transactions for the product. |
:::
### Export invoice
To export an invoice, you need to do the following:
1. From the list of invoices, select the invoice that you want to export.
2. From the invoice details page, click the **Export invoice** button.
3. From the dropdown menu, select whether you want to export the invoice as a **PDF** or an **Excel** file.
## Support
If you have any questions about your invoices or require assistance, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
---
## Transactions
The Signicat **Transactions** service provides you with information about all transactions for a selected account.
:::info Try it in the Signicat Dashboard
To manage transactions in the Signicat Dashboard, go to **Signicat Dashboard** > **Billing and Analytics** > [**Transactions**](https://dashboard.signicat.com/transactions).
:::
:::note Informational use only
The overview of transactions shown in the Transactions service is for informational use only. This means that there may be slight differences when compared to the invoiced amount of transactions, as can be seen in the **Invoices** service.
:::
## How does the transactions service work?
### Get started
You can view transactions for your account in the Signicat Dashboard. To do this:
1. Log in to the [Signicat Dashboard](https://dashboard.signicat.com).
2. In the top navigation bar, use the dropdown menu next to your organisation name to select the account that you want to view transactions for.
3. Navigate to the [**Transactions**](https://dashboard.signicat.com/transactions) service.
:::tip Where can I find the Transactions service?
From the Signicat Dashboard, you can access the Transactions service in two ways:
- Under the **Management** heading, click **Transactions**.
- In the left-side menu, expand the **Billing & Analytics** dropdown menu, then click **Transactions**.
:::
### Changing accounts
Only transactions for the account you currently have selected in the Signicat Dashboard are shown. To view transactions for another account, you need to:
1. Navigate to the top navigation bar in the Signicat Dashboard.
2. Expand the dropdown menu next to your organisation name.
3. Select the account that you want to view transactions for.
### Setting the time period
The Transactions service shows an overview of transaction data for the selected time period.
- The content in the transactions overview is updated daily.
- Transactions will be available in the transactions overview the day after they occur.
To specify the time period that you want to view transactions for:
1. Click the **Select a period to view transaction** field.
2. Use the calendar interface to select a start and finish date for the time period.
:::tip Tip
You can also use the options shown under the **Quick select** section to set the time period with a configured amount, such as the last three months.
:::
3. To confirm your selection, click the **Select** button.
### Grouping transactions
You can group the list of transactions using one of the available groupings, which are displayed as tabs above the table of transactions:
- Daily
- Monthly
- Quarterly
- Yearly
## What does a transaction look like?
Each transaction is listed with the following data fields:
:::CustomTable{columnWidths="25% 75%"}
| **Data field** | **Description** |
| :--- | :--- |
| Date | The date of the transaction. |
| Usage type | Information about what product is being used for the transaction. **Example (migrated)**: `srn:sue:1:authbroker:nbid:auth` **Example (not-migrated)**: `com.signicat.services.nbidjs.authentication.method`
| Method name | The name of the method used. This field is only shown if not included in the _Usage type_. **Example**: nbid
| Product | The name of the product being used from Signicat. **Example**: Norwegian BankID High - Authentications |
| Invoiced | **CPQ**: The total number of transactions with status _Invoiced_. **Legacy**: This is always `0`. You need to check the invoice for information. |
| Completed | The total number of transactions with status _Completed_. |
| Started | The total number of transactions with status _Started_. |
| Loaded | The total number transactions with status _Loaded_. |
| Failed | The total number of transactions with status _Failed_. |
:::
### Transaction states
To learn about what the different transaction states mean, see the table below:
:::CustomTable{columnWidths="25% 75%"}
| **State** | **Description** |
| :--- | :--- |
| Invoiced | The transactions have been invoiced. |
| Started | The transaction started, but did not finish with a successful response such as _Completed_. **Note**: Cancelled transactions are included in the _Started_ state, as it is not a successful response. |
| Completed | The transaction completed successfully. **Note**: When a transaction is completed, the status changes from _Started_ to _Completed_. |
| Loaded | The transaction initialised, but never progressed from its initial state. **Note**: This state only applies if you have not migrated to our new platform. |
| Failed | The transaction ended in an error state, due to an error occurring on our side. |
:::
## Support
If you have any questions about your invoices or require assistance, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
---
## Communication
The Signicat **Communication** service lets you manage your configurations for SMS messages and email. These custom settings override the default Signicat settings.
:::info Try it in the Signicat Dashboard
To access the communication service, go to **Signicat Dashboard** > **Branding** > [**Communication**](https://dashboard.signicat.com/communication).
:::
## What is communication?
We use SMS messages and emails to communicate important information from Signicat services to your end-users. For example, when you want a document to be signed, an email or SMS message can be sent to your end-user with a signing link.
With this service, you can:
- Customise the email and SMS sender name.
- Specify the preferred primary and secondary SMS provider.
- Add your own custom domain for sending emails.
- Customise your own email sender address prefix.
- Directly connect to your own SMTP server for emails.
- Look at delivery logs and the corresponding status.
### Example use case
When you want a document to be signed, the account's email configuration is retrieved, and if not overridden, a Signicat default email is used. You may override these settings to customise the email domain, sender and sender address being sent from provided services such as Signature.
## What does a test message look like?
If you are testing our services with a sandbox account, then we prepend all emails and SMS messages with a test message warning.
- For emails, we prepend the contents with a warning banner. This banner describes that the email is intended solely for testing purposes and warns the recipient against clicking on any of the links, unless they are actively conducting tests.
- For SMS messages, we prepend the message with `TEST SMS:`.
:::info Why do we do this?
We do this to protect recipients from clicking on potentially malicious links that appear to come from Signicat.
:::
## SMS
From the [**SMS**](https://dashboard.signicat.com/communication/sms) page, you can manage the SMS settings for your account.
### Customise the SMS sender name
This is the name of the sender that is displayed to the recipient of the SMS when receiving the text. To change this:
1. From the [**SMS**](https://dashboard.signicat.com/communication/sms) page, click the **Edit** button.
2. In the **Sender** field, replace 'Signicat' with the name of your choice. The name must consist of 3 to 11 alphanumeric characters (`A-Za-z0-9`). It can also contain dots (.) and spaces.
3. Click the **Save** button.
### Customise the primary SMS provider
This is the primary SMS provider to use when sending SMS messages. To change this:
1. From the [**SMS**](https://dashboard.signicat.com/communication/sms) page, click the **Edit** button, then click the **Primary SMS provider** field.
2. From the dropdown menu, select the provider of your choice.
3. Click the **Save** button.
### Add a secondary SMS provider
This is the secondary SMS provider to use as a fallback if there is a temporary failure with the primary SMS provider. This is disabled by default.
The primary SMS provider is always used first. If there is a failure, then the SMS message is automatically attempted with the secondary provider if enabled.
To add a secondary SMS provider:
1. From the [**SMS**](https://dashboard.signicat.com/communication/sms) page, click the **Edit** button, then click the **Secondary SMS provider** field.
2. From the dropdown menu, select the provider of your choice.
3. Click the **Save** button.
## Email
From the [**Email**](https://dashboard.signicat.com/communication/email) page, you can:
- Manage the email settings for your account.
- Add your own custom email domain for use in sending emails.
### Customise the from address prefix
The full email address uses the form `{from_address_prefix}@{domain_name}`. The Signicat domain is the default setting, hence the default email address is `noreply@email.signicat.com`.
To customise the `from_address_prefix`:
1. From the [**Email**](https://dashboard.signicat.com/communication/email) page, on the **Email settings** tab, click the **Edit** button.
2. In the **From address prefix** field, replace 'noreply' with the prefix of your choice.
3. Click the **Save** button.
### Customise the email sender name
To customise the name of the sender that is displayed to the recipient when they are viewing the email:
1. From the [**Email**](https://dashboard.signicat.com/communication/email) page, on the **Email settings** tab, click the **Edit** button.
2. In the **Sender** field, replace 'Signicat' with the name of your choice.
3. Click the **Save** button.
### Use custom SMTP server settings
To specify whether to connect to a custom SMTP server, and use a sending API key:
1. From the [**Email**](https://dashboard.signicat.com/communication/email) page, on the **Email settings** tab, click the **Edit** button.
2. Click the toggle button beside **Use custom SMTP server settings**. A new set of fields will appear.
3. Complete the fields as required.
:::details What do the fields mean?
| **Field name** | **Description** |
| :-- | :-- |
| Port | Set which SMTP port to use when connecting to the SMTP server. The default is **25**, and available options are **25**, **587** and **465**. |
| Host Address | **Required**: Set which SMTP host to connect to. For example: `smtp.mydomain.com`. |
| Sender Address | **Required**: Set the default sender address to use when sending emails. For example: `noreply@email.mydomain.com`. If the **Sender address cannot be overridden** box is ticked, then the **Sender Address** cannot be overridden via any API calls, and is always used. |
| Authentication flow | Set the method to authenticate to the SMTP server. This can be either: **None**: Requires no authentication. **Username and password**: Requires a valid username and password for the SMTP server. **XOauth2**: Requires a client ID, client secret, necessary scopes and endpoint for retrieving an access token on your behalf. |
| Disable Certificate Validation | Set whether certificates from the SMTP server being connected to are required to be signed by globally trusted certificate authorities. Certificate validation is disabled by default. |
:::
4. Click the **Save** button.
### Add your own custom domain
You can add your own custom domain for use in sending emails.
:::tip Tip
If you set up your own domain, then you are using SMTP settings.
:::
To do this:
1. From the [**Email**](https://dashboard.signicat.com/communication/email) page, on the **My domains** tab, update the **Domain** field with your desired domain. For example: `my.domain.com`.
2. Optionally, you can define a custom DKIM selector instead of using a generated one. All characters must be lowercase, with an allowed length of between 2 and 11 characters.
3. Click the **Add domain** button.
4. Your DNS records are generated and are visible on the next page. You can now add these to your own hosting provider.
5. After adding these DNS records to your hosting provider, periodic checks occur which check if the domain has been verified and is ready for use. You can also click the **Verify DNS** button to manually attempt to verify the domain.
6. When verified, the **Use Domain** button is no longer greyed out and can now be clicked.
7. Once clicked, a pop-up appears where you can add the desired prefix for the default sender address, for example: `mycompany`. The domain is appended, separated by `@`; this results in a default sender address of `mycompany@my.domain.com`.
8. Click the **Confirm** button. Your custom domain is now active for future emails.
### Edit one of your domains
1. From the [**Email**](https://dashboard.signicat.com/communication/email) page, on the **My domains** tab, click the three dots under the **Actions** header
2. Click **Edit** from the dropdown menu.
3. You are taken to the individual domain view where the DNS records are, where you can make any desired changes.
### Delete one of your domains
:::note Note
You can only delete a domain if it is not currently in use.
:::
1. From the [**Email**](https://dashboard.signicat.com/communication/email) page, on the **My domains** tab, click the three dots under the **Actions** header.
2. Click **Delete** from the dropdown menu.
3. As a preventative measure against accidental deletion, you must type the domain which you want to delete in the provided field in the dialogue box.
4. Press the **Delete domain** button in the dialogue box.
### Use one of your domains
:::note Note
You can only use a domain if it is not already in use and it is verified. If not, then the **Use domain** option is not visible in the dropdown menu.
:::
1. From the [**Email**](https://dashboard.signicat.com/communication/email) page, on the **My domains** tab, click the three dots under the **Actions** header.
2. Click **Use domain** from the dropdown menu.
## Logs
From the [**Logs**](https://dashboard.signicat.com/communication/logs) page, you can view logs of your recently sent email and SMS message events using either the **SMS** or **Email** tab.
When you have sent an email or SMS for that specific account, these messages appear with their status on this page.
### Filter by event status
To filter the events by the event status:
1. From the [**Logs**](https://dashboard.signicat.com/communication/logs) page, select either the **SMS** or **Email** tab.
2. Expand the first dropdown menu and make a selection.
:::details What are the possible statuses?
- For SMS, the possible statuses are:
- All
- Delivered
- Sent
- Failed
- For email, the possible statuses are:
- All
- Delivered
- Opened
- Sent
- Failed
:::
### Order by timestamp
To order the events by their timestamp:
1. From the [**Logs**](https://dashboard.signicat.com/communication/logs) page, select either the **SMS** or **Email** tab.
2. Click the **Timestamp** button to sort via ascending or descending order.
### View the raw JSON or message for an event
To open up the individual event to view the raw JSON and message itself:
1. From the [**Logs**](https://dashboard.signicat.com/communication/logs) page, view either the **SMS** or **Email** tab.
2. Click the three dots under the **Actions** header, to the right of the event you want to see further details for.
- To view the raw JSON, click **View JSON** from the dropdown menu.
- To view the message, click **View message** from the dropdown menu.
---
## Branding
We offer branding tools for customising communication settings and themes, so that you can create a consistent experience for your end-users.
To learn how to do this, see the guides below:
* [**Communication**](/docs/dashboard/branding/communication): Configure the Signicat Communication services
* [**Theming**](/docs/dashboard/branding/theming): Customise themes for branded experiences
---
## Theming
The Signicat Theming services lets you customise your themes to offer a consistent branding experience to your end-users.
:::info Try it in the Signicat Dashboard
To manage your themes in the Signicat Dashboard, go to **Signicat Dashboard** > **Branding** > [**Theming**](https://dashboard.signicat.com/themes-mgmt).
:::
:::note Which products support theming?
We are in the process of rolling out theming to all Signicat products. For details, see [Which products support theming?](#which-products-support-theming).
:::
## About theming
The Signicat Theming service allows you to configure the appearance of the content that is presented to your end-users, so that you can provide a cohesive user experience and conform with your company's branding guidelines.
With our Theming service, you can determine:
- The placement of a custom logo.
- The placement and size of the headers.
- The background colour or image.
- The alignment of the widget.
- The alignment of the content.
- The colour palette used for the background, headers and buttons.
- The border curvature.
- The typography.
:::info Are themes the same as graphical profiles?
With the new Theming service, you can do everything and more that you could do previously with the [Graphical profiles](https://developer.signicat.com/cs/enterprise/docs/customisation/#graphical-profile) editor.
:::
### Which products support theming?
- eID and Wallet Hub
:::note Graphical profiles for MitID
It is not possible to use Theming service with MitID. If you want to customise the graphical profile for MitID, you can use the [Advanced graphical profile (add-on)](/identity-methods/mitid/user-interface/ui-guidelines.mdx#advanced-graphical-profile-add-on) instead.
:::
:::note Typography
Swedish BankID and FTN do not yet support typography.
:::
- ID Document and Biometric Verification
- Signicat Mint
- MobileID
- Electronic Signature API
:::note Note
- If you are using the Enterprise Electronic Signature API, then we rely on our [Graphical profiles](https://developer.signicat.com/cs/enterprise/docs/customisation/#graphical-profile) editor. To order or modify a graphical profile for the Electronic Signature API, you can contact your key account manager.
- If you are using the Express Electronic Signature API, then refer to the [Theming](https://developer.signicat.com/cs/express/docs/signature/web-ui-config.html#theming) guide in the Express Signature documentation.
- If you are using MitID Express or Enterprise, then refer to the [Advanced graphical profile (add-on)](/identity-methods/mitid/user-interface/ui-guidelines.mdx#advanced-graphical-profile-add-on) guide.
:::
### Built-in accessibility
End-user applications that you build using our Theming service have built-in accessibility that meets WCAG standards, as we embed accessibility best practices such as ARIA roles and keyboard navigation directly within each component.
This ensures an accessible and consistent user experience across all environments where these components are used.
## How does theming work?
You can create custom themes with the [Theming](https://dashboard.signicat.com/themes-mgmt) service in the Signicat Dashboard, which can be configured to your requirements.
:::note Note
Themes do not affect the appearance of the Signicat Dashboard, **only** the appearance of the content that is presented to your end-users.
:::
- A theme can be created on an account level, and can be applied on an account or domain level.
- You can only apply one theme at an account level. This becomes the default theme for the children of that level.
:::tip What does this mean?
This means that if you set the theme at an account level, then any domain under this account gets the theme automatically applied.
:::
- You can apply one or more themes at a domain level.
### What access rights do I need?
In order to work with the Theming service, you need to ensure that you also have a role which provides you with the minimum level of access on an account level, such as the **Account Management Account Viewer** role. This is because themes are applied at an account and/or domain level.
This applies to the theme-related roles listed below, which have to be applied at an account level:
- Theme Editor
- Theme Admin
- Theme Viewer
:::tip What does this mean?
For example, in order to use the **Theme Editor** role to create and update a theme, you also need at least a basic read-only account-level role, such as **Account Management Account Viewer**.
Without a role that gives you the minimum amount of access, you are not able to create and update the theme.
:::
### Get started with the Theming service
You can create and manage themes in the Signicat Dashboard. To do this:
1. Go to **Signicat Dashboard** > **Branding** > [**Theming**](https://dashboard.signicat.com/themes-mgmt).
2. In the top navigation bar, use the dropdown menu next to your organisation name to select the account that you want to make changes to.
:::note Success!
You are now in the account theming section, where you can see the default theme setting. From here, you can customise the theme for the selected account.
:::
## How to create a new theme
To create a new theme:
1. In the [Theming](https://dashboard.signicat.com/themes-mgmt) service, click the **+ Add new** button.
2. Populate the fields in the dialog box, then click the **Create** button.
:::note Success!
You have now created a new theme. This theme is now selectable from the **Selected theme** dropdown menu.
:::
## How to customise a theme
Once you have created a theme, you can customise it to your requirements.
:::warning Important
You must ensure that you are compliant with [Web Content Accessibility Guidelines](https://www.w3.org/WAI/standards-guidelines/wcag/)(WCAG) regarding contrast between typography colours and other elements.
:::
1. In the [Theming](https://dashboard.signicat.com/themes-mgmt) service, use the **Selected theme** dropdown menu to select the theme that you want to edit.
2. Click the **Edit theme** button.
3. Make your desired changes to the theme using the editor. You can customise the:
- Header
- Widget
- Typography
- Colours
- Borders
- Background
:::note Maximum file size
If used, the maximum logo and background image size is 5MB.
:::
3. Once you have finished editing your theme, click the **Save changes** button.
## How to apply a theme
### Apply a theme on an account level
1. In the [Theming](https://dashboard.signicat.com/themes-mgmt) service, you can see the name of the account you are currently making changes to in the **Accounts and domains** dropdown menu.
1. Click the **Use different themes for domains** toggle button.
2. Select the domain you want to make changes to from the **Accounts and domains** dropdown menu.
3. Use the **Selected theme** dropdown menu to select the theme that you want to apply to the account or domain.
4. Click the **Apply theme** button.
### Apply a theme on a domain level
If you have created domains under your account, then it is possible to apply a different theme to each domain that you have. If you want to do this, you must use the following order:
1. Set the custom theme for the account.
2. Set the custom theme for the domain(s).
If you set the account theme after the domain themes instead, then the account theme will overwrite the saved custom domain themes and your work will be lost.
We recommend that you create two distinct themes first. By doing this, you prevent any loss of work if you decide that you want to apply one theme at an account level and one theme for a specific domain.
To set a custom theme for a domain:
1. In the [Theming](https://dashboard.signicat.com/themes-mgmt) service, click the **Use different themes for domains** toggle button.
2. Select the domain you want to make changes to from the **Accounts and domains** dropdown menu.
3. Use the **Selected theme** dropdown menu to select the theme that you want to apply to the account or domain.
4. Click the **Apply theme** button.
#### Apply multiple themes for a domain
If you have created domains under your account, then it is possible to apply multiple themes to each domain that you have. To do this:
1. In the [Theming](https://dashboard.signicat.com/themes-mgmt) service, click the **Use different themes for domains** toggle button.
2. Select the domain you want to make changes to from the **Accounts and domains** dropdown menu.
3. Click the **Use multiple themes for this domain** toggle button.
4. Select the theme that you want, then click the **+ Add theme** button. Repeat this step for every theme that you want to apply. The added themes will appear in the list below.
5. Once you are happy with your selection, click the **Apply multiple themes** button to proceed.
## How to export a theme
You can use the export feature to reuse themes for either the same account or another account.
Given that you have the correct permissions in the destination organisation and account, it is possible to export themes to another account in the same or another organisation.
- A theme can be exported multiple times.
- Every exported theme is unique with its own theme ID.
- Every exported theme can be edited independently under the destination account.
:::note Required permissions
To export a theme, you need to have both:
- The minimum level of access on an account level, such as the **Account Management Account Viewer** role.
- The permissions associated with the **Theme Editor** in the destination organisation.
:::
To export a theme:
1. In the [Theming](https://dashboard.signicat.com/themes-mgmt) service, ensure that the correct account is selected. If not, you can update this using the dropdown menu in the top navigation bar.
2. Use the **Selected theme** dropdown menu to select the theme that you want to export, then click the **Export theme** button.
3. Use the **Select organisation** dropdown menu to select the target organisation for the exported theme.
4. Use the checkboxes under **Your selected accounts** to select one or multiple account that you want to export the theme to.
5. Click the **Export theme** button.
## Specify a theme per request
If you have multiple themes for a domain or account, then you can specify which theme you want to use per request.
The way you do this depends on which [authentication protocol](/docs/eid-hub/) you use.
### OpenID Connect
To specify a theme when using OpenID Connect, you must use the `acr_values` URL parameter.
```url title="Example: Specify a theme with OIDC"
acr_values=theme:xfwfyv1340
```
In this example,`xfwfyv1340` is the theme ID. You can find and copy the required theme ID from the Themes service in the Signicat Dashboard.
:::tip Want to learn more?
To learn more about ACR values, see [acr_values](/docs/eid-hub/oidc/oidc-implementation.mdx#acr_values) in our the OIDC documentation.
:::
### Authentication REST API
To specify a theme when using the Authentication REST API, you must use the optional `themeId` field when creating authentication sessions.
```json title="Example: Specify a theme with the Authentication REST API"
"themeId": "agkaa12"
```
In this example,`agkaa12` is the theme ID. You can find and copy the required theme ID from the Themes service in the Signicat Dashboard.
:::tip Want to learn more?
To learn more about this, see our [Authentication REST API reference documentation](/apis/eid-hub/).
:::
### SAML 2.0
Information will follow soon.
---
## Access tokens
An access token is a string that encodes the security information used to authenticate and provide authorisation information to Signicat APIs. Your application sends the access token when making calls to Signicat APIs.
## Token caching
We recommend that you cache access tokens when interacting with Signicat APIs. This helps to limit your network usage and resource overhead, whilst reducing traffic to Signicat servers.
For example, you can cache your access tokens using a memory cache, such as Redis or a simple in-memory cache. You then renew the tokens when they get close to the token expiration time.
If the access tokens fail, then you can configure your application to retry the request one more time.
## Token lifetime
An access token has a relatively short lifetime. This is set to 600 seconds by default.
Once the access token expires, it can no longer be used. This is very important for security. To obtain a new access token, you need to send a new access token request.
You can edit the default token lifetime of your API client. To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**API clients**](https://dashboard.signicat.com/api-clients/).
2. On your API client, click **Edit**.
3. On the **Overview** tab, set the desired value in the **Access token lifetime** field.
:::note Allowed values
You can set a value from 1 to 3600 seconds.
:::
4. Select **Update** to save the changes.
---
## HTTP request requirements
Incoming HTTP requests to any of our APIs must meet specific requirements. If a request does not follow the required structure, then it will fail and return an appropriate error response.
## POST and PUT requests
For HTTP/1.1 `POST` and `PUT` requests, our APIs always expect a body. This means the request must explicitly indicate the body's length or use chunked transfer encoding, even if the body is empty.
To satisfy this requirement, the request must include either:
- A `Content-Length` header.
- A `Transfer-Encoding` header with chunked as the final value.
If neither of the above options are present, or if chunked is not the final encoding listed, then the request will fail and return an error message with a `411 Length Required` status code.
:::note Note
This requirement only applies to HTTP/1.1. It does not apply to HTTP/2, which handles message framing differently.
:::
```http title="Example: HTTP/1.1 POST request with Content-Length header"
POST /example-api HTTP/1.1
Host: api.signicat.com
Content-Type: application/json
Content-Length: 16
{"name": "Jane"}
```
```http title="Example: HTTP/1.1 POST request with Transfer-Encoding header"
POST /example-api HTTP/1.1
Host: api.signicat.com
Content-Type: application/json
Transfer-Encoding: chunked
10
{"name": "Jane"}
0
```
:::note Case: Empty body
Request with empty body must also include `Content-Length: 0` or `Transfer-Encoding: chunked`.
:::
## GET requests
For HTTP/1.1 and HTTP/2 `GET` requests, our APIs do not support a body. Any `GET` request that includes a body will fail and return an error message with a `400 Bad Request` status code.
---
## Advanced settings
This page contains topics for further configuring your connection to Signicat APIs.
You can use the buttons below to learn about advanced settings such as configuring the access token lifetime and the requirements when making a HTTP request to Signicat APIs:
* [**Access tokens**](/docs/dashboard/connect-to-signicat-apis/advanced-settings/access-tokens): Learn about configuring access tokens
* [**HTTP request requirements**](/docs/dashboard/connect-to-signicat-apis/advanced-settings/http-request-requirements): Learn about HTTP request requirements
---
## Connect to Signicat APIs
All Signicat APIs are hosted at the `api.signicat.com` domain and use the OAuth 2.0 protocol for authorisation. Each request must include an `Authorization` header to authenticate and authorise operations.
## Set up a connection
Learn how to connect to any Signicat API by creating an API client, obtaining an access token and making your first request.
* [**Quick start guide**](/docs/dashboard/connect-to-signicat-apis/quick-start-guide): Learn how to set up a connection to any Signicat API
* [**All Signicat APIs**](/docs/dashboard/connect-to-signicat-apis/signicat-apis): Explore an overview of all Signicat API references
## Advanced connection settings
Learn how to manage advanced settings when connecting to Signicat APIs, such as token lifetime and HTTP request requirements.
* [**Advanced settings**](/docs/dashboard/connect-to-signicat-apis/advanced-settings/): Learn how to manage advanced settings
---
## Quick start guide
# Quick start guide
Learn how to set up a connection to any Signicat API.
This quick start guide shows you how to:
1. Complete the initial preparations, if required.
2. Create an API client in the Signicat Dashboard.
3. Set permissions for your API client.
4. Request an access token using your API client credentials.
5. Use the access token to make an API request. Make your first request to an API.
:::details Authorisation flow sequence diagram
```mermaid
sequenceDiagram
title Authorisation flow for Signicat APIs
participant App as Your application
participant S as Authorization server (/auth/open/connect/token)
participant API as Signicat API
box Signicat infrastructure
participant S
participant API
end
App->>+S: Request access token with API client credentials
S-->>App: Return access token
App->>API: Request resource with access token in 'Authorization' header
Note right of API: 1. Verify access token2. Check permissions3. Check product is active
API-->>App: Return protected resource
```
:::
## 1. Initial preparations
To use any Signicat API in your applications, you first need to sign up to the Signicat Dashboard. This allows you to configure an account, create API credentials and manage products.
Before you start, make sure you have:
- [Signed up to Signicat](/docs/) in the Signicat Dashboard.
- Created an [organisation](/docs/dashboard/organisation-management/organisations.mdx), an [account](/docs/dashboard/organisation-management/accounts.mdx) and a [domain](/docs/dashboard/organisation-management/domains/) in the Signicat Dashboard.
:::note Sandbox and production accounts
We recommend that you create a sandbox account to test our services before going live. You must set up sandbox and production accounts separately.
:::
## 2. Get client credentials
To authenticate against our APIs, you need to set up an API client with scope `signicat-api`. An API client consists of a `client_id`/`client_secret` pair.
We recommend that you create one API client per API product, but this can depend on your use case or configuration. To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**API clients**](https://dashboard.signicat.com/api-clients/).
2. Select **+ Add client**.
3. Enter a name for the client, then select **Create**.
4. You must have at least one client secret, so select **Add secret** to create one. This takes you to the **Secrets** tab on the client details page.
5. Select **+ Add secret** to create a secret.
6. Enter a name for the client secret, then select **Generate secret**.
:::warning Store the client secret
Make sure that you store the client secret in a secure place. This is the only time that you can view the client secret in clear text.
If you do lose your client secret, then you can always generate another one.
:::
:::tip Find the client ID
An API client has an associated client ID visible in the client overview. For example, this could look something like `dev-round-apple-123`.
:::
## 3. Set permissions
To complete the API client setup, you need to add the correct permissions for the API products that you intend to connect to with the client. To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**API clients**](https://dashboard.signicat.com/api-clients/).
2. Select **Edit** next to the API client that you created.
3. On the API client page, navigate to the **Permissions** tab.
:::note Cannot access the permissions tab?
If you cannot access the **Permissions** tab, then you do not have the correct role to manage permissions for your organisation.
To receive access, contact your organisation administrator or us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
4. Select **+ Select product**.
5. Tick the box corresponding to the API product that you intend to use with this API client, then select **Update** to save the changes.
:::note Cannot find the necessary permissions?
This tab only shows permissions for our most used products.
- To learn about which product permissions you need to add, see the [Most used product permissions](#most-used-product-permissions) section.
- To learn about how to add any other permissions not shown here, see the [Advanced permissions](#advanced-permissions) section.
:::
### Most used product permissions
The **Permissions** tab for your API client is designed for convenience and only displays the most used product permissions, shown in the table below.
:::tip Cannot find the necessary permission?
To learn about how to add any other permissions not shown below, see the [Advanced permissions](#advanced-permissions) section.
:::
:::CustomTable{title="Permissions for most used products" columnWidths="25% 25% 50%"}
| **Product** | **API** | **Permissions** |
| :-- | :-- | :-- |
| [ID Document and Biometric Verification](/docs/id-document-and-biometric-verification/) | [Assure REST API](/apis/id-document-and-biometric-verification/) | `Assure API` |
| [eID and Wallet Hub](/docs/eid-hub/) | [Authentication REST API](/apis/eid-hub/) | `Authentication REST API` |
| [Data Verification](/docs/data-verification/) | [Data Verification API](/apis/data-verification/) | `Data Verification for natural persons``Data Verification for organisations` |
| [Digital Evidence Management (DEM)](/docs/digital-evidence-management/) | [Digital Evidence Management API](/apis/digital-evidence-management/) | `Digital Evidence Management (DEM)` |
| [Mint](/docs/mint/) | [Mint API](/apis/mint/) | `Flow Editor` `Flow Viewer` **Note**: To set these permissions, you need to follow the steps in the [Advanced permissions](#advanced-permissions) section. |
| [MobileID](/docs/mobile-identity/mobileid/) | [MobileID API](/apis/mobileid/) | `MobileID API` |
| [MobileID](/docs/mobile-identity/mobileid/) | [MobileID Admin API](/apis/mobileid-admin/) | `MobileID Admin API` |
| [ReuseID](/docs/reuseid/) | [ReuseID Onboarding API](/apis/reuseid-onboarding/) | `ReuseID Onboarding API` |
| [ReuseID](/docs/reuseid/) | [ReuseID API](/apis/reuseid/) | `ReuseID MobileID Device API` `ReuseID Passkey API` |
| [Electronic Signing](/docs/electronic-signing/) | [Sign API v2](/apis/electronic-signing/sign-api-v2/) | `Signature API` |
| [Signicat IAM (SIAM)](/docs/siam/) | [SIAM SCIM API](/apis/siam/) | `Signicat IAM SCIM API` (`SiamEditor`) **Note**: To set `SiamViewer` or `SiamAdmin`, you need to follow the steps in the [Advanced permissions](#advanced-permissions) section. |
:::
### Advanced permissions
You can manage all other advanced permissions for your API client using the **Access management** service in the Signicat Dashboard. To do this:
1. Go to **Signicat Dashboard** > **Access management** > [**Permissions**](https://dashboard.signicat.com/ownidp-management/permissions).
2. Click the **Edit** button beside the API/machine client that you want to update.
3. Click the **+ Add** button and select the desired role that you want to add. You can repeat this step to add multiple roles.
4. To confirm your changes, click the **Save** button.
:::info Want to learn more?
For more information, see the [Managing roles and permissions](/docs/dashboard/access-management/managing-roles-and-permissions.mdx) page.
:::
## 4. Obtain an access token
You can now use the API client credentials to obtain an access token. To do this, you need to send a POST request using either of the following client authentication methods:
- Explicit credentials (`client_secret_post`)
- HTTP basic authentication (`client_secret_basic`)
The table below shows an overview of the parameters required to build a request:
:::CustomTable
| **Name** | **Value** |
| :-- | :-- |
| Authorisation type | OAuth 2.0 |
| Access Token URL | `https://api.signicat.com/auth/open/connect/token` |
| Grant type | `client_credentials` |
| Scope | `signicat-api` |
| Client ID | The client ID that you obtained when you created the API client. |
| Client secret | The client secret that you obtained when you created the API client. |
:::
:::tip What tools can I use?
You can obtain an access token using cURL, Postman, Node.js, Python, .NET, or whichever SDK or library you prefer. However, note that the OAuth 2.0 client credentials flow requires you to make only one POST request.
:::
1. Make a request using either of the client authentication methods:
To obtain an access token using the `client_secret_post` authentication flow, you need to include your client credentials explicitly in the request payload.
```bash title="Example: Request for access token"
curl --request POST https://api.signicat.com/auth/open/connect/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data 'grant_type=client_credentials' \
--data 'scope=signicat-api' \
--data 'client_id=sandbox-round-apple-123' \
--data 'client_secret=fakeCl13n7S3Cr3T1234567890'
```
To obtain an access token using the `client_secret_basic` authentication flow, you need to format your API client credentials as `client_id:client_secret`, then Base64 encode it. Next, substitute this string for `` in the authorisation header of the request.
```bash title="Example: Request for access token"
curl --request POST https://api.signicat.com/auth/open/connect/token \
--header 'Authorization:Basic ' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data 'grant_type=client_credentials' \
--data 'scope=signicat-api'
```
2. If the request is successful, then a token response is returned to you. For example:
```http title="Example: Response with access token"
HTTP/2 200 OK
content-type: application/json; charset=UTF-8
cache-control: no-store, no-cache, max-age=0
{
"access_token": "eyJh ... QifQ.eyJ ... hIOw",
"expires_in": 600,
"token_type": "Bearer",
"scope": "signicat-api"
}
```
:::info Token settings
The default access token lifetime is set to 600 seconds. For more information about token lifetime and caching, see the [Access tokens](/docs/dashboard/connect-to-signicat-apis/advanced-settings/access-tokens.mdx) page.
:::
## 5. Make an API request
Now that you have a valid access token, you can start making requests to your chosen Signicat API. To do this, you need to include the access token in the HTTP `Authorization` header with the `Bearer` scheme
For example, the request below shows what a call to the [Authentication REST API](/apis/eid-hub/) could look like:
```http {4} title="Example: Request to Authentication REST API"
GET /auth/rest/sessions/{id} HTTP/2
Host: api.signicat.com
Accept: application/json
Authorization: Bearer eyJh ... QifQ.eyJ ... hIOw
```
:::warning HTTP requests
Incoming HTTP requests to all of our APIs must meet specific requirements. For more information, see the [HTTP request requirements](/docs/dashboard/connect-to-signicat-apis/advanced-settings/http-request-requirements.mdx) page.
:::
## Next steps
For more specific information on how to use Signicat API products, see our API reference or product documentation:
* [**Signicat APIs**](/docs/dashboard/connect-to-signicat-apis/signicat-apis): Explore all Signicat API references
* [**Signicat products**](/docs/products): Browse all Signicat products
:::info Advanced API connection settings
To learn about how to manage advanced API connection settings such as token lifetime and HTTP request requirements, see the [Advanced settings](/docs/dashboard/connect-to-signicat-apis/advanced-settings/) page.
:::
---
## Signicat APIs(Connect-to-signicat-apis)
:::info How to connect to Signicat APIs
To learn how to set up a connection to any Signicat API and start making requests, see our **Connecting to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::
## Product APIs
Our product APIs deliver core functionality for Signicat products. You can explore the API reference documentation for our products using the buttons below:
### Data Verification
Verify customer data against different national and commercial data sources.
* [**Data Verification API**](/apis/data-verification/): Verify information about natural persons or organisations
### Digital Evidence Management (DEM)
Store transactional data or consent messages.
* [**Digital Evidence Management API**](/apis/digital-evidence-management/): Securely capture, store and manage audit trail data
### eID and Wallet Hub
Manage authentications with eIDs and wallets with the Signicat Authentication REST API.
* [**Authentication REST API**](/apis/eid-hub/): Manage end-user authentications using our Authentication REST API
### Electronic Signing
Create electronic signatures on contracts, declarations, forms and other documents.
* [**Sign API v2**](/apis/electronic-signing/sign-api-v2/): Electronic signatures for both small to medium sized businesses and those within regulated industries
* [**Enterprise Sign API**](/apis/electronic-signing/enterprise/): Electronic signatures for businesses within regulated industries
* [**Express Signature API**](/apis/electronic-signing/express/): Electronic signatures for small to medium-sized businesses
* [**Signicat Archive**](/apis/archive/): Securely store and retrieve signed documents
### ID Document and Biometric Verification
Perform electronic identity verification (eIDV) with Assure API.
* [**Assure API**](/apis/id-document-and-biometric-verification/): Perform electronic identity verification (eIDV) on end-users using our Assure REST API
### MobileID
Implement strong customer authentication on mobile devices.
:::note Want to use our next-generation API?
The [ReuseID API](/apis/reuseid/) is our next-generation API for ReuseID services, including MobileID.
- We recommend this for all customers, so that you can utilise the latest capabilities and improvements.
- For existing customers, it is possible to use ReuseID and MobileID in parallel.
:::
* [**MobileID API**](/apis/mobileid/): Manage identities and carry out mobile authentication operations
* [**MobileID Admin API**](/apis/mobileid-admin/): Manage and administer your MobileID account
### Ongoing Monitoring
Monitor changes to the identifying data of natural persons and organisations over time.
* [**Person Monitoring API (Deprecated)**](/apis/person-monitoring/): Monitor information on natural persons over time
* [**Ongoing Monitoring API**](/apis/ongoing-monitoring/): Monitor information on natural persons and organisations over time
### ReuseID
Build your own reusable identities with ReuseID.
* [**ReuseID Onboarding API**](/apis/reuseid-onboarding/): Use ready-made flows to onboard ReuseID identities and perform step-up operations
* [**ReuseID API**](/apis/reuseid/): Manage identities and carry out ReuseID authentication operations
### Secure Share
Create, manage and secure the files you share with others.
* [**Secure Share API**](/apis/secure-share/): Share files securely with other people
### Signicat Mint
Build custom business workflows and simplify your user journeys with a no-code platform.
* [**Signicat Mint API**](/apis/mint/): Manage your flows and analyse your user journey reports
### User management
Manage your end-users and create reusable identities globally with Signicat IAM.
* [**Signicat IAM SCIM API**](/apis/siam/): Manage identity and access management for your platform
## Management APIs
Our management APIs allow you to programmatically manage configurations that are typically handled in the Signicat Dashboard. You can explore the API reference documentation for managing configurations using the buttons below:
:::note Note
Our management APIs are not fully supported or covered by the same service-level agreements (SLAs) and uptime as our product APIs. This means that although they are maintained and functional, they are intended for developers who are looking to tackle a particular corner case, such as a custom integration.
:::
### Audit logs
* [**Signicat Audit API**](/apis/audit-logs/): Query, view and filter activities in the audit logs
### Account management
* [**Signicat Account Management API**](/apis/account-management/): Manage your organisations, accounts, and company information. Download invoices
### Domain management
* [**Signicat Domain Management API**](/apis/domain-management/): Manage the domains for your account
### Events management
* [**Signicat Events Management API**](/apis/events/): Create and manage subscriptions to events published by Signicat services
### OIDC Configuration API
* [**OIDC Configuration API**](/apis/oidc-config/): Manage your OIDC client configuration (Advanced)
### Usage analytics
* [**Signicat Usage API**](/apis/usage/): View analytics and insights on your API usage to track and optimise performance
---
## Error codes
When you make a request to one of Signicat's APIs and an error occurs, a response with an error object is returned.
If you have encountered an error, check the information on this page to investigate what might have caused the error. Specifically, the errors listed here are generic to all Signicat APIs.
If you require assistance, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
## Error object
A generic error object contains the following fields:
:::CustomTable
| Field name | Description | Format | Always returned |
|------------|-------------|--------|-----------------|
| `type` | URI to the documentation that describes the error. | String | |
| `title` | A summary of the error type (this does not change between occurrences of the error). | String | |
| `code` | A machine-readable string, indicating the error code. This is a constant. | String | |
| `status` | The HTTP status code generated by the origin server (specific to this occurrence of the error). | HTTP status code | |
| `detail` | An explanation of the error (specific to this occurrence of the error). | String | |
| `invalidParams` | List of request parameters that have failed the validation. Contains the parameter name and the reason for validation failure. | String | |
:::
:::note Additional fields
Many APIs also define additional error fields to address and communicate product-specific errors.
:::
### Example responses
An example response with a generic error object:
```json title="Example 1: Response with generic error object"
{
"type": "https://developer.signicat.com/docs/dashboard/error-codes/",
"title": "Invalid authentication token.",
"detail": "The authentication token provided is invalid. This may be due to an incorrect signature, expiration, or insufficient permissions.",
"code": "invalid_token"
}
```
When validation of request parameters fails, you receive an error message similar to:
```json title="Example 2: Response with failed validation of request parameters"
{
"type": "https://api.signicat.com/mobileid/core/openapi.json",
"title": "Invalid request parameter",
"code": "invalid_request_parameter",
"status": 400,
"traceId": "4bf239c088089f2bca77d3a413909f1d",
"detail": "Your request body parameters have failed validation."
"invalidParams": [
{
"name": "userId"
"reason": "userId cannot be null or empty"
},
{
"name": "deviceId"
"reason": "deviceId cannot be null or empty"
}
]
}
```
:::details What does this example mean?
In this example, we can determine that multiple request parameters have failed the validation.
The `invalidParams` describes which request parameters have failed the validation, so that you can modify them to pass the validation.
:::
## Generic error codes
:::CustomTable{columnWidths="40% 20% 40%"}
| Error code | Error name | Description |
| :-- | :-- | :-- |
| `account_disabled` | Account disabled | The account is disabled and cannot be used for this operation. |
| `account_does_not_exist` | Account not found | No account exists with the specified ID. |
| `account_id_invalid` | Invalid account ID | The `accountId` is not in the correct format. |
| `account_id_missing` | Missing account ID | No `accountId` was provided or could be found in the request. |
| `invalid_account_id` | Invalid account ID | An invalid `accountId` was sent in the request. |
| `invalid_redirect_url` | Invalid redirect URL | An unexpected `redirectUrl` was received by one of the components.**Note**: Internal API calls often have a response with a `redirectUrl`. |
| `invalid_message_id` | Invalid message ID | The `messageId` is unknown or unexpected for the current user session. |
| `invalid_pushback_url` | Invalid pushback URL | An invalid `pushBackUrl` was received by one of the components. **Note**: In a headless authentication flow, a `pushBackUrl` can optionally be provided in the request. |
| `invalid_token` | Token validation error | The authentication token provided in the API request is invalid. This can happen if: The token's signature is incorrect. The token has expired. The token lacks the required permissions for this operation. |
| `invalid_transaction_id` | Invalid transaction ID | The `transactionId` is unknown or unexpected for the current user session. |
| `missing_permission` | Insufficient permission | You do not have the required permission to perform this operation on the target resource. |
| `multiple_account_ids_provided` | Conflicting account IDs | The request contains multiple `accountId` values from different sources, such as headers, query parameters or a JWT. |
| `not_found` | Not found | A HTTP 404 error. This means that the service you requested was not found. |
| `product_not_enabled` | Product not enabled | The account does not have access to the requested product. |
| `quota_usage_over_limit` | Quota limit exceeded | The rate of API requests exceeds the quota limit. This means that the response includes a [HTTP 429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/429) status code and a [Retry-After](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After) header, which specifies how long (in seconds) to wait before retrying. **Note**: To request a quota increase, [create a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard. |
| `session_error` | Session error | A generic error that occurs in various Signicat backend components. Common causes are: The user session expires due to inactivity on pages of interaction. A public endpoint was called with wrong or unexpected session state. For example, calling a SAML ACS endpoint without first starting a login session from a service provider. |
| `subject_account_permission_not_granted` | Permission Denied | The subject does not have the required permission for the specified account. |
| `token_invalid_exp` | Token expired | The bearer token has expired. |
| `token_invalid_issuer` | Invalid issuer | The bearer token's issuer in not valid. |
| `token_invalid_nbf` | Token not yet valid | The bearer token is not valid yet. |
| `token_invalid_not_a_jwt` | Invalid token format | The bearer token is not a valid JWT. |
| `token_invalid_scope` | Invalid scope | The bearer token does not have the required `signicat-api` scope. |
| `token_invalid_signature` | Invalid signature | The bearer token's signature is invalid. |
| `token_missing` | Token missing | The request does not include a bearer token. |
| `transaction_id_or_message_id_replayed` | Replay error | A Signicat backend component attempted to start a login session with a `messageId` or a `transactionId` that was used recently. |
| `unexpected_error` | Unexpected error | An unexpected error occurred in a Signicat service and it is not handled properly. **Note**: This error is usually accompanied by an HTTP 500 response. |
:::
## Product-specific error codes
All APIs can return generic error codes. There are also error codes specific to a service, such as an API product or a protocol.
To learn more about error codes and descriptions specific to a service, visit the respective documentation:
- [Data Verification](/docs/data-verification/error-codes/)
- [eID and Wallet Hub - OIDC](/docs/eid-hub/oidc/oidc-error-codes/)
- [MobileID API](/docs/mobile-identity/mobileid/error-codes/)
- [Ongoing Monitoring](/docs/ongoing-monitoring/error-codes/)
- [Sign API v2](/docs/electronic-signing/sign-api-v2/error-codes/)
---
## Glossary
Here you will find a complete overview of all the most important terms used in the Signicat documentation and an explanation of each.
### Account
Your organisation can have different types of accounts configured in the Signicat Dashboard, such as [production](#production) or [sandbox](#sandbox) (test) accounts. You can learn more about organisations and accounts in our [Organisation management](/docs/dashboard/organisation-management/) documentation.
### Authentication
Authentication is about recognising a returning user. It is important to have an easy way to allow users to authenticate their identity each time they log in to a website, app or service.
### Authorisation
Authorisation is about what an end-user is allowed to do. Whilst authentication allows an end-user to log in to an account, and thereby prove who they say they are, authorisation states what the end-user can now do, what kind of actions they are allowed to perform on your platform. Examples could be accessing an the HR system, or being allowed to enter new employees into the HR system.
### Certificate
A certificate, or digital certificate, is an electronic document used to prove the ownership of a public key. The certificate includes information about the key, information about the identity of its owner (called the subject), and the digital signature of an entity that has verified the certificate's contents (called the issuer). For Signicat, certificates are either used to secure connections or as a means of logging in.
### Custom domain
The custom domain using your organisation's own domain, `something.mycompany.com` for an [account](#account). See also [Signicat domain](#signicat-domain).
### Digital identity
A digital identity is a person's identity in the digital space, meaning the sum of all digital information that can be linked to the person. Digital identity may also be used in a more narrow sense, for example to indicate the person's official identity attributes from an identity document or from an eID.
### eIDs
The electronic identities (eIDs) used for identity proofing, user authentication, and electronic signing; for example BankID in Norway, MitID in Denmark and iDIN in the Netherlands. An eID is a means for a person to provide certain identity attributes, such as name, national identification number, date of birth, and so on. User attributes are stored by the eID and provided to your application on demand. Suppliers of eIDs are known as [Identity Providers (IdP)](#identity-provider).
### eID method
See [eIDs](#eids).
### eIDAS
eIDAS is a 2014 regulation of the European Parliament and Council on electronic identification and trust services for electronic transactions in EU/EEA. In the Netherlands, eIDAS is provided through the eHerkenning network.
### Electronic identification
The process of using personal identification data in electronic form which uniquely represents either a natural or legal person, or a natural person representing a legal person.
### Electronic signature
This is data in electronic form, which is attached to or logically associated with other data in electronic form, that is used by the signatory to sign.
### End-user
In Signicat terms, the end-user is the person who ultimately uses a product. For example, in B2C signing, the end-user is not the company using the Sign solution to get their documents signed, but rather the private person who signs the document.
### EUDI Wallets
EU Digital Identity Wallets (EUDI Wallets) let users prove who they are and share verified credentials like age and nationality across borders, with greater privacy, stronger security, and full EU-wide interoperability. By late 2027, regulated industries will be required to accept EUDI Wallets, especially for Strong Customer Authentication (SCA) to stay compliant.
### ID method
See [eIDs](#eids).
### Identity method
See [eIDs](#eids).
### Identity verification
Identity verification is the act of determining the identity of an individual or organisation. This is something the individual or organisation do themselves. It can be done, for example, by using an eID (which has already been verified), or by scanning an identity document in conjunction with providing a selfie; but requirements may differ. Identity verification is useful for first time interactions with a customer, such as registration or onboarding.
### Identity provider
An identity provider is the supplier of the eID. They are responsible for issuing the digital identities to a person. Customers can choose one or more of these identity providers to enable the end-user to log on to their online applications or services. Often, the identity provider and the eID share the same name, for example BankID in Norway and Sweden, but it might also be different. For example, Nets is the identity provider for MitID.
### Internal log
This is a log that is used by Signicat's staff to analyse incidents.
### Know Your Customer (KYC)
KYC is the process of a business verifying the identity of its clients. The objective of KYC guidelines is to prevent banks from being used, intentionally or unintentionally, by criminal elements for money laundering activities.
### Level of Assurance (LoA)
Level of Assurance (LoA) refers to the degree of trust or confidence in the claimed identity of a person and how certain a [service provider](#service-provider) is about that person's claimed identity when using their eID to authenticate a service. {/*LoA refers to the difficulty one would have trying to use someone else's eID.*/}
According to eIDAS regulations, there are three levels of assurance: Low, Substantial and High.
1. **Low**: Self-registration in a web-page, without any identity verification.
2. **Substantial**: Providing and verifying identity information and authentication by using a user name and a password and a one-time password sent to your mobile phone.
3. **High**: Registering in person in an office and authentication by using a smartcard, such as a National ID Card.
### National identification number
National identification numbers are used by many countries' governments as a means of tracking their citizens, permanent residents and temporary residents for the purposes of work, taxation, government benefits, health care and many other government-related functions. This number usually appears on identity documents issued by these countries.
### Natural person
A natural person, in legal terms, is defined as a living human being as opposed to a corporate body.
### Non-natural person
A non-natural person is any corporate body, unincorporated firm, partnership or body with legal personality other than an individual.
### Onboarding
Onboarding is the process of allowing end-users to sign up to an online service whereby a verification of that person is carried out using an eID. Onboarding refers to a first-time interaction with an end-user during the process of becoming a customer of a service and outlines what Signicat customers want to do to accept these new users to their service.
### One-Time Password (OTP)
A One-Time Password is a randomly generated password, which is given to the end-user; for example as a text message (SMS), an email, a postal letter, by an app on a smartphone, or by a device. When entering the OTP, the end-user proves that they are in possession of the given item. This is typically used as part of a two-step authentication.
### Organisation
This is the name of your company, business or organisation (one entity with a VAT number). Your organisation can have many [accounts](#account) in the Signicat Dashboard. You can learn more about organisations and accounts in the [Organisation management](/docs/dashboard/organisation-management/) documentation.
### Organisation number
This is the number that identifies an organisation. The organisation number name varies from country to country ("Organisation Identification Number" in the Netherlands, "Enterprise number" in Belgium, "CVR" in Denmark, "Registration number" in Sweden). You can use this number in Signicat [Data Verification](/docs/data-verification/) to validate company information.
### Organisation Identification Number (OIN)
An OIN is an Organisation Identification Number, or can also be called a Government Identification Number. You use it to identify yourself as an organisation.
{/*## Parent organisation
Reseller of Signicat, and option for organisations requiring multiple billing entities. This entity can also have a “parent organisation” to create a hierarchy that have depth n+1.*/}
### Politically exposed person (PEP)
In financial regulation, a politically exposed person (PEP) is one who has been entrusted with a prominent public function. A PEP generally presents a higher risk for potential involvement in bribery and corruption by virtue of their position and the influence that they may hold.
### Product
The name of a specific product in Signicat's portfolio. For an overview of products, see [All products](/docs/products.mdx).
### Product family
A group of products in Signicat's portfolio. At Signicat, we organise our product according to the following product families: Identity Proofing, Trust Orchestration, Authentication and Electronic Signing.
### Production
This is an [account](#account) type used in Signicat's production environment. It contains real data. The transactions are billed.
### Sandbox
This is an [account](#account) type used in either Signicat's test or preproduction environments. It should only contain fake data. No transactions are billed.
### SDK
A software development kit (SDK).
### Service provider
A service provider (SP) is a customer of Signicat. This is the party that uses the digital identity service and provides the service to the end-user, such as a bank, insurance company, public body. SPs offer one or more identity methods (eIDs) on their app, portal or website so that end-users can identify or gain access to these online services.
### Signicat domain
The Signicat subdomain for an account `accountname.app.signicat.com` (production). All accounts can have a Signicat subdomain. See also [Custom domain](#custom-domain).
### Single logout (SLO)
With single log-out (SLO), an end-user can log out of all active sessions (even over multiple different service providers) by sending a single log-out request to the application of the service provider. SLO can be initiated by the end-user or the service provider, or in some cases by the IdP. SLO is session- and token-based. For more information, see [eID and Wallet Hub - SLO](/docs/eid-hub/oidc/oidc-implementation.mdx#single-log-out-slo)
### Single sign-on (SSO)
With single sign-on (SSO), an end-user can log in to services once and access them without having to re-enter authentication factors. This only applies to services that are connected to the same SSO session. SSO is session- and token-based. For more information, see [eID and Wallet Hub - SSO](/docs/eid-hub/concepts/single-sign-on.mdx)
### Time-based OTP (TOTP)
A time-based OTP service generates one-time passwords (OTP) based on time, whereby the user has a certain, limited amount of time to enter the time-based OTP. Typically, the user relies on a smartphone app for generates time-based OTP codes. One such application is the Google Authenticator.
### Two-factor authentication (2FA)
Also referred to as two-step verification or dual-factor authentication, two-factor authentication is the process in which end-users must provide two different authentication factors to verify themselves. 2FA is a secure process that helps protect both an end-user's credentials and the resources the user can access.
---
## Signicat Dashboard
The Signicat Dashboard gives you the tooling and infrastructure to onboard customers, sign agreements, manage user logins and automate identity workflows, all whilst staying compliant across markets.
:::info Take me to the [Signicat Dashboard](https://dashboard.signicat.com/)!
:::
## Get to know the Dashboard
If you specified an organisation name in the registration form when signing up to the Signicat Dashboard, then we automatically create the resources below for you, ready for when you log in the first time.
These resources allow you to start building your integration with Signicat products in a test environment:
:::CustomTable{tableName="Your resources in the Signicat Dashboard" }
| **Resource name** | **Description** |
| :-- | :-- |
| [Organisation](/docs/dashboard/organisation-management/organisations.mdx) | This matches the organisation name that you provided in the registration form. |
| [Sandbox account](/docs/dashboard/organisation-management/accounts.mdx) | This allows you to try out our services using test data. |
| [Domain](/docs/dashboard/organisation-management/domains/) | This is associated with your sandbox account, and is required for using certain products. |
:::
:::details I did not add an organisation name in the registration form
If you did not specify an organisation name in the registration form, then these resources are not automatically set up for you. To set them up manually:
1. Log in to the [Signicat Dashboard](https://dashboard.signicat.com/), then click the **Create organisation** button.
2. Enter your organisation name, then click the **Create** button.
3. To add an account:
1. Go to **Signicat Dashboard** > **Organisation**.
2. Click the **+ Add account** button, then follow the on-screen instructions.
4. To add a domain:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains/).
2. Click the **+ Add domain** button, then follow the on-screen instructions.
:::
:::info Going live with a production account
To configure your organisation for a live integration in production, you need to undertake necessary preparations such as registering your company details. You can learn how to do this in the [Organisation management](/docs/dashboard/organisation-management/organisations.mdx) documentation.
:::
## Tutorial video
This video shows you how to navigate and use the Signicat Dashboard. Explore topics such as:
- How to invite users.
- How to configure your product.
- How to view your statistics and invoices.
## Next steps
* [**Organisations**](/docs/dashboard/organisation-management/organisations): Learn how to add, manage and delete organisations
* [**Accounts**](/docs/dashboard/organisation-management/accounts): Learn how to create and delete sandbox and production accounts
* [**Domains**](/docs/dashboard/organisation-management/domains/): Learn how to add and manage standard Signicat domains and custom domains
* [**Connect to Signicat APIs**](/docs/dashboard/connect-to-signicat-apis): Learn how to connect to Signicat APIs
* [**Logging in**](/docs/dashboard/logging-in/): Learn how to manage your login methods for the Signicat Dashboard
---
## IP addresses and DNS
This page contains crucial information about connecting to Signicat services. The only supported method for service consumption is through the Domain Name System (DNS).
While we provide our IP address ranges for firewall configuration, a proper understanding of our DNS-first policy is essential for ensuring stable and reliable integration.
:::warning Important: How our infrastructure changes
It is important to understand the two ways our network infrastructure can change:
* **Service routing (without prior notice):** We may shift services between the IP addresses (listed on this page) to perform maintenance or manage load at any time. This is the main reason why it is required to use the DNS and follow the TTLs.
* **IP range updates (with prior notice):** We rarely add new IP addresses or remove old ones. If this happens, we notify you in advance.
The IP ranges on this page are provided **exclusively** for configuring your firewall's allowlist. They must not be used for service connections.
:::
## DNS requirements
Signicat services are designed to be accessed at their respective domain names (for example, `api.signicat.com`), leveraging DNS for robust, flexible and secure connectivity. Our infrastructure is dynamic, and IP addresses can change without prior notice.
To further enhance security, all Signicat domains are configured with DNSSEC (Domain Name System Security Extensions), which ensures that the DNS records you receive from our domain names are authentic and have not been tampered with.
**Directly connecting to IP addresses or failing to respect DNS TTLs will lead to service disruptions.**
It is critical that all clients and systems consuming Signicat services properly resolve our domain names and **strictly adhere to the Time-To-Live (TTL) values** specified in our DNS records. Failure to do so will lead to connectivity issues, especially during planned maintenance, infrastructure updates, or disaster recovery scenarios.
### Best practices
* **Always** use the provided domain names to connect to Signicat services.
* **Ensure** you configure your DNS resolvers and client applications to honour the TTL values of our DNS records.
* **Avoid** hardcoding IP addresses in your configurations.
* **Use** a DNSSEC-validating resolver.
* If you experience connectivity issues, **verify** your DNS resolution and cache behaviour, as a first step for troubleshooting.
## IP addresses for firewall configuration
### Incoming traffic
All incoming traffic to Signicat passes through a Loadbalancer available at the following IP addresses:
:::CustomTable{columnWidths="33% 33% 33%"}
| Service | IPv4 addresses | IPv6 addresses |
| :----------- | :--------------- | :------------- |
| Loadbalancer | `34.117.2.96/30` | `2a14:b580::/48` |
| CDN | `34.149.131.77` | `2600:1901:0:a1f1::` |
:::
### Outgoing traffic
Outgoing traffic from Signicat originates from the `NAT-main` range. In a disaster recovery scenario, we will redirect this traffic to the `NAT-disaster-recovery` range.
:::CustomTable{columnWidths="50% 50%"}
| Service | IPv4 range |
| :----------- | :--------------- |
| NAT-main | `35.234.168.128/28` |
| NAT-disaster-recovery | `34.88.194.16/28` |
:::
## Additional resources
- To learn more about our networks and infrastructure, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
- To view the real-time status of our platform and services, check out our [Status page](https://status.signicat.com/).
---
## Log in to Signicat with external identity providers
# External identity providers
You can log in to the Signicat Dashboard using external identity providers (IdPs). These are third-party IAM platforms, like Microsoft Entra ID and Okta.
By connecting your external identity provider, you and your team can access the Signicat Dashboard with single sign-on (SSO) by using your existing corporate login credentials. As an administrator, you can manage user access, team logins and permissions directly from your identity and access management (IAM) platform.
Integrating an external identity provider offers several key benefits:
- **Centralised access control**: Manage user access from your existing IAM platform.
- **Consistent user experience**: Maintain your enterprise policies and multi-factor authentication (MFA) settings.
- **Simplified logins**: Allow your team to access the Signicat Dashboard without needing to create separate user profiles.
## Choose your identity provider
To learn how to set up, configure and log in with third-party identity providers, make a selection using the buttons below:
* [**SSO with Microsoft Entra ID**](/docs/dashboard/logging-in/external-identity-providers/microsoft-entra-id): Learn how to configure and log in with Microsoft Entra ID.
* [**SSO with Okta**](/docs/dashboard/logging-in/external-identity-providers/okta): Learn how to configure and log in with Okta.
---
## Set up Signicat Dashboard login with Microsoft Entra ID
You can set up single sign-on (SSO) for the Signicat Dashboard using Microsoft Entra ID as your external identity provider. This setup allows you to manage user authentication centrally in Microsoft Entra ID while giving your team secure access to Signicat services.
:::note Production accounts only
The external identity provider feature is only available for production accounts in the Signicat Dashboard.
:::
The Signicat Microsoft Entra ID integration allows you to use your Microsoft identity platform as your identity provider to centralise user management operations for your organisation in the Signicat Dashboard.
When you configure Microsoft Entra ID as an external identity provider, your team can use their existing work accounts to log in securely to the Signicat Dashboard, without having to set up new user profiles.
## Get started
:::info How to activate Microsoft Entra ID as an external identity provider
To enable Microsoft Entra ID as an external identity provider, you need to request access from an onboarding manager by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
## Prerequisites
Before you begin the integration process, ensure you have the necessary permissions in Microsoft Entra ID. You need a Microsoft Entra ID user account with one of the following administrator roles:
- Global Administrator
- Application Administrator
- Cloud Application Administrator
Confirm that you have one of these required roles inside your Microsoft Entra tenant before you proceed with the integration.
## Register an application in Microsoft Entra ID
To set up the integration, you need to register a new OpenID Connect (OIDC) application within the Microsoft Entra admin center. This application establishes the trust relationship between Microsoft Entra ID and the Signicat Dashboard.
1. Log in to the [Microsoft Entra admin center](https://entra.microsoft.com/).
2. Browse to **Entra ID** > **App registrations** and select **New registration**.
4. Enter a clear name for your application (for example, `Signicat Dashboard SSO`).
5. Choose your preferred supported account types (typically **Single tenant only - \** for most applications).
6. Under the **Redirect URI** section, set the platform dropdown to **Web** and enter the Signicat callback URL. This is `https://login.signicat.com/idps/oidc-vendor/response`.
7. Click the **Register** button to create the application.
8. On the application's **Overview** page, copy the **Application (client) ID** and **Directory (tenant) ID** values and save them. You will need them shortly.
For an overview of the steps, see the official documentation to [Register an application in Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app).
### Add a secret to your application
1. In the [Microsoft Entra admin center](https://entra.microsoft.com/), in **App registrations**, select your application.
2. Select **Certificates & secrets** > **Client secrets** > **New client secret**.
3. Add a description for your client secret.
4. Select an expiration for the secret or specify a custom lifetime.
5. Select **Add**.
6. Record the client secret **Value**. You will need it shortly. This secret value is never displayed again after you leave this page.
For an overview of the steps, see the official documentation to [Add and manage application credentials in Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity-platform/how-to-add-credentials?tabs=client-secret).
## Configure SSO in the Signicat Dashboard
To configure SSO with Microsoft Entra ID in the Signicat Dashboard, you must contact your onboarding manager or the Signicat support team by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
When you submit your ticket, include the following authentication details from your newly registered Microsoft Entra ID application:
:::CustomTable
| Field name | Value | Description |
| :--- | :--- | :--- |
| **CLIENT_ID** | Your Microsoft Entra Application (client) ID | The unique client identifier that you copied from your application overview. |
| **CLIENT_SECRET** | Your Microsoft Entra Client Secret | The secret key value that you generated in the certificates and secrets section. |
| **TENANT_ID** | Your Microsoft Entra Directory (tenant) ID | The directory ID of your Microsoft Entra tenant where the application is registered. |
:::
## Log in with Microsoft Entra ID SSO
Once Signicat configures your integration, you can test the authentication flow to confirm that Microsoft Entra ID successfully handles single sign-on.
1. Open a new private or incognito browser window.
2. Navigate to the [Signicat IDP Selector page](https://dashboard.signicat.com/login-idp-selector).
3. Select **Log in with Microsoft Entra ID** from the list of available external identity providers.
4. Enter your work email address associated with your Microsoft Entra tenant.
5. Select **Log in**.
6. Enter your credentials in the Microsoft login portal when redirected, and complete any required multi-factor authentication (MFA).
7. Confirm that Microsoft successfully authenticates you and redirects you back to the Signicat Dashboard.
## Assign Microsoft Entra ID groups to Signicat roles
To enable automated provisioning, you need to configure role mapping between your Microsoft Entra ID groups and specific roles in the Signicat Dashboard. Signicat uses this role mapping to assign the correct permissions to new team members automatically.
Role mapping across platforms ensures that your team members automatically receive the correct permissions when they log in to the Signicat Dashboard for the first time.
### 1. Manage Microsoft Entra ID groups
Before defining the mapping to Signicat roles, you need to add and define user groups in the Microsoft Entra ID platform. To learn about how to manage user groups, visit the official documentation to [Manage Microsoft Entra groups and group membership](https://learn.microsoft.com/en-us/entra/fundamentals/how-to-manage-groups).
### 2. Configure Signicat roles and mapping
After you have created and configured your user groups in the Microsoft Entra ID platform, you can define the mapping between those groups and the roles supported by the Signicat Dashboard.
To learn about the roles and permissions for the Signicat Dashboard, visit the [Managing roles and permissions](/docs/dashboard/access-management/managing-roles-and-permissions/#which-roles-to-assign) documentation.
After you have identified the roles to assign to your team, Signicat Support can help you configure your role mapping. To do this, you need to [create a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::note Note
In your request, you must provide a list of the Microsoft Entra ID groups, with their respective **Object Id** values, that you want to map to Signicat roles.
:::
## User management with the SCIM REST API
You can edit the roles, permissions and profiles of your existing users after they have already onboarded to the Signicat Dashboard. To modify the configuration of existing users, you need to use the **Signicat IAM SCIM API**.
This REST API allows you to manage user identity and access programmatically across your platforms by performing the following operations:
- Get user profiles and attributes.
- Update users and their attributes (such as modifying roles for existing, onboarded users).
- Deactivate users.
- Lock and unlock user access.
To learn more about managing your existing users programmatically, see the [Signicat IAM SCIM API](/apis/siam/) reference documentation.
---
## Set up Signicat Dashboard login with Okta
You can set up single sign-on (SSO) for the Signicat Dashboard using Okta as your external identity provider. This setup allows you to manage user authentication centrally in Okta while giving your team secure access to Signicat services.
:::note Production accounts only
The external identity provider feature is only available for production accounts in the Signicat Dashboard.
:::
The Signicat Okta integration allows you to use Okta as your identity provider to centralise user management operations for your organisation in the Signicat Dashboard.
When you configure Okta as an external identity provider, your team can use their existing Okta credentials to log in securely to the Signicat Dashboard, without having to set up new user profiles.
## Get started
:::info How to activate Okta as an external identity provider
To enable Okta as an external identity provider, you need to request access from an onboarding manager by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
## Prerequisites
Before you begin the integration process, ensure you have the [necessary permissions in Okta](https://help.okta.com/en-us/content/topics/security/administrators-admin-comparison.htm). You need an Okta user account with one of the following administrator roles:
- Super Admin
- Org Admin
- Group Admin
To check your user permissions in Okta, follow these steps:
1. Log in to your Okta Admin Console.
2. Select **Directory** > **People** in the left menu.
3. Select your user profile from the list.
4. Select the **Admin roles** tab.
Confirm that you have one of the required roles before you proceed with the integration.
## Create an Okta application
Once you have the required permissions, you need to create a new OpenID Connect (OIDC) application in Okta to represent the Signicat Dashboard.
1. Log in to your Okta Admin Console.
2. Select **Applications** > **Applications** in the left sidebar menu.
3. Select **Create App Integration**.
4. Choose **OIDC - OpenID Connect** as your sign-in method, then select **Next**.
5. Select **Web Application** as your application type, then select **Next**.
6. Enter a clear name in the **App integration name** field (for example, `Signicat Dashboard SSO`).
7. Under the **Grant type** section, select the **Authorization Code** checkbox.
8. In the **Sign-in redirect URIs** field, enter the Signicat Dashboard callback URL. This is `https://login.signicat.com/idps/okta/response`.
9. Under the **Assignments** section, select the Okta user groups that require access to the Signicat Dashboard.
10. Select **Save** to create the application.
11. Navigate to the **General** tab, copy the **Client ID** and **Client Secret**, and save them securely for the next phase.
:::note Post-logout redirect URL
If your setup requires a post-logout Redirect URI, you can use `https://dashboard.signicat.com/signout-callback-oidc`.
:::
## Configure SSO in the Signicat Dashboard
To configure SSO with Okta in the Signicat Dashboard, you need to contact your onboarding manager or the Signicat support team by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
When you submit your ticket, include the following authentication details from your newly created Okta application:
:::CustomTable
| Field name | Value | Description |
| :--- | :--- | :--- |
| **Issuer URL** | Your custom Okta domain URL (for example, `https://your-organisation.okta.com`) | This tells Signicat where to direct your team members for authentication. |
| **Client ID** | Your Okta Client ID | The unique identifier of your application that you copied from your Okta application. |
| **Client Secret** | Your Okta Client Secret | The secret key that you copied from your Okta application. |
| **Scopes** | `openid`, `profile`, `email`, `phone`, `groups`, `address` | These permissions allow Signicat to retrieve basic user details from Okta and map them to your user profiles in the Signicat Dashboard. |
:::
## Log in with Okta SSO
Once Signicat configures your integration, you can test the authentication flow to confirm that Okta successfully handles single sign-on.
1. Open a new private or incognito browser window.
2. Navigate to the [Signicat IDP Selector page](https://dashboard.signicat.com/login-idp-selector).
3. Select **Log in with Okta** from the list of available external identity providers.
4. Enter your work email address associated with your Okta domain.
5. Select **Log in**.
6. Enter your credentials in your Okta login portal when redirected.
7. Confirm that Okta successfully authenticates you and redirects you back to the Signicat Dashboard.
## Assign Okta groups to Signicat roles
To enable automated provisioning, you need to configure role mapping between your Okta groups and specific roles in the Signicat Dashboard. Signicat uses this role mapping to assign the correct permissions to new team members automatically.
Role mapping across platforms ensures that your team members automatically receive the correct permissions when they log in to the Signicat Dashboard for the first time.
To learn about the roles and permissions for the Signicat Dashboard, visit the [Managing roles and permissions](/docs/dashboard/access-management/managing-roles-and-permissions/#which-roles-to-assign) documentation.
After you have identified the roles to assign to your team, Signicat Support can help you configure your role mapping. To do this, you need to [create a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::note Note
In your request, you must provide a list of the Okta groups that you want to map to Signicat roles.
:::
## User management with the SCIM REST API
You can edit the roles, permissions and profiles of your existing users after they have already onboarded to the Signicat Dashboard. To modify the configuration of existing users, you need to use the **Signicat IAM SCIM API**.
This REST API allows you to manage user identity and access programmatically across your platforms by performing the following operations:
- Get user profiles and attributes.
- Update users and their attributes (such as modifying roles for existing, onboarded users).
- Deactivate users.
- Lock and unlock user access.
To learn more about managing your existing users programmatically, see the [Signicat IAM SCIM API](/apis/siam/) reference documentation.
---
## Logging in
The Signicat Dashboard supports multiple authentication methods, allowing you to log in using:
- A username and password
- Multi-factor authentication (MFA) with a time-based one-time password (TOTP)
- A passkey
- External identity providers (IdPs) with single sign-on (SSO)
:::note Note
A username and password is the standard method for logging in to your Signicat user profile. MFA is required if your user profile has access to one or more production accounts.
:::
To learn how to set up, configure and log in with them, make a selection using the buttons below:
* [**Username and password**](/docs/dashboard/logging-in/username-and-password): Learn about logging in with a username and password
* [**MFA with TOTP**](/docs/dashboard/logging-in/multi-factor-authentication): Learn about logging in with multi-factor authentication and TOTP
* [**Passkeys**](/docs/dashboard/logging-in/passkeys): Learn about logging in with a passkey
* [**External IdPs with SSO**](/docs/dashboard/logging-in/external-identity-providers): Learn about logging in with SSO
---
## Multi-factor authentication (MFA)
Multi-factor authentication (MFA) with time-based one-time passwords (TOTP) provide an extra layer of security for your Signicat user profile.
When enabled, you must enter a 6-digit code from an authenticator app such as _Google Authenticator_ or _Microsoft Authenticator_ after entering your password.
:::note Mandatory MFA
If your user profile has access to one or more production accounts, then you are required to configure multi-factor authentication (TOTP) during the login process to proceed.
:::
On this page, you can learn about:
- How to set up MFA for your Signicat user profile.
- How to log in to the Signicat Dashboard using MFA.
- How to remove MFA from your Signicat user profile.
## How to set it up
:::note Before you start
Before you can set up MFA, you must first log in to the Signicat Dashboard using your [username and password](/docs/dashboard/logging-in/username-and-password.mdx).
:::
To set up this authentication method, you need to:
1. Go to the [Signicat Dashboard](https://dashboard.signicat.com), then click your user icon in the top navigation bar.
2. From the dropdown menu, select **Manage profile**. You are now on the [Personal info](https://dashboard.signicat.com/user-profile/personal-info) page.
3. In the **Multi-factor authentication** section, click the **Set up** button.
4. In the dialog box, enter the password for your Signicat user profile, then click the **Verify** button.
5. Using your preferred authenticator app on your mobile device, scan the QR code shown in the dialog box in the Signicat Dashboard.
:::tip Enter key manually
If you are having issues with the QR code, then you can also enter the key manually using the link beneath it.
:::
6. In the dialog box, enter the 6-digit code from the authenticator app on your mobile device, then click the **Continue** button.
7. Use the **Download** or **Copy** buttons to save the recovery codes in a secure location.
:::tip What are recovery codes?
If you lose your mobile device used for two-factor authentication, then you can use these recovery codes to log in to your user profile instead of the 6-digit verification code from the authenticator app.
Each recovery code can only be used once.
:::
8. Tick the **I have saved my recovery codes** box, then click the **Confirm** button.
## How to log in using MFA
To log in using this authentication method, you need to:
1. Go to the [Signicat Dashboard](https://dashboard.signicat.com).
2. On the login page, enter your **Email address** and **Password** in the respective fields.
3. Click the **Log in** button.
4. Enter the verification code from your configured authenticator app.
5. Optionally, you can tick the box to remember your device for 7 days.
:::tip What does this mean?
This means that you do not have to enter a verification code the next time you log in within this timeframe.
:::
6. Click the **Next** button.
## How to remove MFA
To remove this authentication method, you need to:
1. Go to the [Signicat Dashboard](https://dashboard.signicat.com), then click your user icon in the top navigation bar.
2. From the dropdown menu, select **Manage profile**. You are now on the [Personal info](https://dashboard.signicat.com/user-profile/personal-info) page.
3. In the **Multi-factor authentication** section, click the **Remove** button.
4. In the dialog box, enter your current password, then click the **Confirm** button.
---
## Passkeys
Passkeys are a safe and easy alternative to passwords.
Once you have registered a passkey, you can log in to your Signicat user profile using:
- Your biometric sensor, such as a fingerprint or facial recognition.
- Your PIN or pattern.
:::warning Important
To use passkeys, you must have a supported device and browser. Most modern operating systems (Windows, macOS, iOS, Android) and browsers (Chrome, Safari, Edge, Firefox) support passkeys.
:::
On this page, you can learn about:
- How to set up a passkey for your Signicat user profile.
- How to log in to the Signicat Dashboard using a passkey.
- How to remove a passkey from your Signicat user profile.
## How to set it up
:::note Before you start
Before you can register a passkey, you must first log in to the Signicat Dashboard using your [username and password](/docs/dashboard/logging-in/username-and-password.mdx).
:::
To set up this authentication method, you need to:
1. Go to the [Signicat Dashboard](https://dashboard.signicat.com), then click your user icon in the top navigation bar.
2. From the dropdown menu, select **Manage profile**. You are now on the [Personal info](https://dashboard.signicat.com/user-profile/personal-info) page.
3. In the **Passkey** section, click the **+ Add passkey** button.
4. In the dialog box, enter the password for your Signicat user profile, then enter a name for the passkey.
5. Click the **Continue** button.
6. Follow the on-screen instructions provided by your browser or operating system to create and save your passkey.
7. Once successfully completed, a dialog box appears in the Signicat Dashboard, confirming that the passkey has been added. You can click the **Close** button to dismiss this.
## How to log in
To log in using this authentication method, you need to:
1. Go to the [Signicat Dashboard](https://dashboard.signicat.com).
2. On the login page, select **Sign in with passkey**.
3. Follow the on-screen instructions provided by your browser or operating system to authenticate using your biometric sensor, PIN, or pattern.
:::tip Authentication fallback
If you are unable to use your passkey, then you can choose to log in using another method, such as with your standard password or an email-based login.
For example, this could happen if you are on a new device or your biometric sensor fails.
:::
## How to remove a passkey
To remove this authentication method, you need to:
1. Go to the [Signicat Dashboard](https://dashboard.signicat.com), then click your user icon in the top navigation bar.
2. From the dropdown menu, select **Manage profile**. You are now on the [Personal info](https://dashboard.signicat.com/user-profile/personal-info) page.
3. In the **Passkey** section, click the bin icon beside the passkey that you would like to remove.
4. In the dialog box, enter your current password, then click the **Remove** button.
---
## Username and password
A username and password is the standard method for logging in to your Signicat user profile.
On this page, you can learn about:
- How to log in to the Signicat Dashboard using your login credentials.
- How to update your login credentials.
- How to reset a forgotten password using a password reset email.
## How to log in
To log in using this authentication method, you need to:
1. Go to the [Signicat Dashboard](https://dashboard.signicat.com).
2. On the login page, enter your **Email address** and **Password** in the respective fields.
3. Click the **Log in** button.
## How to update your login credentials
To update your login credentials, you need to:
1. Go to the [Signicat Dashboard](https://dashboard.signicat.com), then click your user icon in the top navigation bar.
2. From the dropdown menu, select **Manage profile**. You are now on the [Personal info](https://dashboard.signicat.com/user-profile/personal-info) page.
3. In the **Login credentials** section, click the **Edit** button beside the credential that you would like to update.
:::tip Tip
It is possible to update your email address, username and password.
:::
4. In the dialog box, enter your current password and the updated credential in the provided fields.
5. Click the **Save** / **Continue** button.
## How to reset a forgotten password
If you have forgotten your password, then we can send a reset link to your email address. To do this:
1. Go to the [Signicat Dashboard](https://dashboard.signicat.com).
2. On the login page, click the **Forgot your password?** link.
3. Enter your email address associated with your Signicat user profile, then click the **Send reset link** button.
4. Open your email and locate the password recovery email from Signicat, then click the **Reset password** button to visit the password reset page.
5. Enter your new password in the provided fields.
---
## Accounts
An account is a logical entity to group and separate resources and billing within your organisation. You can think of accounts similarly to how the departments within your company are distinct units.
Accounts come in different types to allow you to distinguish between test and production environments.
The information in each account is stored separately, which may be an important consideration depending on your needs. Having separate accounts can be helpful for billing purposes, for example, if two departments within your company are using Signicat products. It also allows you to thoroughly control how each account is used.
:::info Try it in the Signicat Dashboard
To manage your accounts in the Signicat Dashboard, go to **Signicat Dashboard** > [**Organisation**](https://dashboard.signicat.com/org-mgmt/) and select an account.
:::
## Account types
When creating an account, you can choose between a [sandbox account](/docs/dashboard/glossary.mdx#sandbox) and a [production account](/docs/dashboard/glossary.mdx#production).
**Sandbox accounts**
Opt for a sandbox account if you wish to test your integration with any Signicat product using fake data. A sandbox account is a trial environment where you can play around with and test your integration.
**Production accounts**
Production accounts contain real data and allow you to purchase products in the Marketplace. You must use a production account to integrate your application with Signicat in a live environment.
:::warning Note
It is not possible to edit the account type after creation. However, you can create multiple accounts under the same organisation.
:::
## Create an account
To create an account in the Signicat Dashboard, do the following:
1. Log in to the [Dashboard](https://dashboard.signicat.com/).
2. Select the name of your organisation at the top left of the screen and then select **Manage**.
3. Under **Organisation management**, select **Add Account**.
4. Enter the name of your account under **Account Name**.
5. Tick the box of the account type you wish to create, either **Sandbox account** or **Production account**.
6. Select **Create** to create the new account.
## Delete an account
To delete an account in the Signicat Dashboard, do the following:
1. Log in to the [Dashboard](https://dashboard.signicat.com/).
2. Select the name of your organisation at the top left of the screen and then select **Manage**.
3. Under **Organisation management**, select an existing account.
4. In the **Account management** page, expand **Account actions** and select **Delete**.
5. To restore the account, select **Undelete**.
6. To permanently delete the account, select **Permanently delete**. You cannot undo this operation.
## Next steps
Before you can get started with an integration, many products require that you add at least one domain.
* [**Domains**](/docs/dashboard/organisation-management/domains/): Learn how to add and manage standard Signicat domains and custom domains
---
## Business details
As a part of the company registration process, you need to add the business details for your company in the Signicat Dashboard so that you are able to use our services in production.
:::info Why do we need this?
We collect this information to enhance your business service and meet regulatory and financial partner requirements.
:::
To add your business details:
1. Go to **Signicat Dashboard** > **Organisation** > [**Business details**](https://dashboard.signicat.com/org-mgmt/company-registration/business-details/).
2. In the **Country** dropdown menu, select the country where your company is registered.
3. In the **Company registration number** field, enter the registration number for your company. Ensure that this accurately matches the number in the relevant country's company register.
4. To fetch available details, click the **Lookup** button.
:::note Note
Some countries do not support lookup functionality. If your country is not supported, then you need to manually enter all of your business details into the available fields.
:::
5. In the **Industry** dropdown menu, select the industry that best matches your company.
6. In the **Operates in** dropdown menu, select the country where your company conducts business. If your company operates in multiple countries, then you must add every country that applies.
7. Review that the company address is correct. If not, then you can make changes by clicking the **Edit** button.
8. To finalise your changes, click the **Continue** button.
:::note Success!
You have now registered your business details.
:::
---
## Company registration
Before you can start using our products, you need to complete the company registration process in the Signicat Dashboard.
To learn how to do this, you can follow the guides listed below:
* [**Business details**](/docs/dashboard/organisation-management/company-registration/business-details): Learn how to enter the business details for your company
* [**Key contacts**](/docs/dashboard/organisation-management/company-registration/key-contacts): Learn how to add key contacts in your organisation
* [**Payment method**](/docs/dashboard/organisation-management/company-registration/payment-method): Learn how to add a payment method for your organisation
---
## Key contacts
As a part of the company registration process, you need to add the following three key contacts for your organisation in the Signicat Dashboard:
- Commercial owner
- Main technical contact
- Financial contact
:::info Why do we need this?
Adding key contacts automatically invites them to the Signicat Dashboard with the correct roles. This then means that important information can be communicated to the appropriate people in your organisation.
:::
To add your key contacts:
1. Go to **Signicat Dashboard** > **Organisation** > [**View key contacts**](https://dashboard.signicat.com/org-mgmt/company-registration/contacts/).
2. For each respective contact, click the **Add** button to assign a contact.
3. Complete all fields on the page:
- **First name**
- **Last name**
- **Business email address**
- **Phone number** with correct country code prefix.
:::tip Tip
If the contact is you, then you can enable the **Autofill with my details** toggle button at the top of the page. This populates all fields with your contact details that we have available in the system.
:::
4. To finalise your changes for a particular contact, click the **Continue** button.
5. Once you have added all key contacts, click the **Continue** button on the **Contacts** overview page.
:::note Success!
You have now added your key contacts.
:::
---
## Payment method
As a part of the company registration process, you need to add the payment method in the Signicat Dashboard that is used to bill your organisation.
To add a new card for your payment method:
1. Go to **Signicat Dashboard** > **Organisation** > [**Payment method**](https://dashboard.signicat.com/org-mgmt/company-registration/payment-method/).
:::tip Tip
If you have already added a card previously, then you may need to click the **Add new card** button once you are on the **Payment method** page.
:::
2. Complete all fields on the page with your card details:
- **Name on the card**
- **Card number**
- **Expiration**
- **CVC**
3. To proceed, you need to confirm the following statements by ticking the corresponding boxes:
- _I confirm that this card will be used to perform payments, including monthly, for my organisation._
- _I confirm that I have the right to use the data I entered and I am solely accountable for its accuracy_.
4. To finalise your changes, click the **Save card** button.
:::note Success!
You have now added a new card as a payment method for your organisation.
:::
---
## Custom domain
A custom domain allows you to create a branded experience for your end-users, as you can customise the entire domain. This means that there is no Signicat branding in the URL.
Your integration might also require a custom domain for security reasons. A custom domain requires an SSL/TLS certificate.
```https title="Example: Custom domain"
..com
```
## Certificate type
When you add a custom domain to your account, you can choose between a **Signicat-managed certificate** or a **Self-managed certificate**.
These SSL/TLS certificate management options are described in the table below:
:::CustomTable{tableName="Overview of certificate types" columnWidths="25% 75%"}
| **Certificate type** | **Description** |
| :-- | :-- |
| Signicat-managed certificate | You only need to configure your DNS settings to point to the custom domain. Signicat handles certificate management and renewal. |
| Self-managed certificate | You manage, provision, and renew your own SSL/TLS certificates. Self-managed certificates can be any of the following certificate types: Domain Validation (DV)Organization Validation (OV)Extended Validation (EV) |
:::
## Set up a custom domain
To learn how to set up a custom domain for your account, make a selection using the buttons below:
* [**Custom domain (Signicat-managed certificate)**](/docs/dashboard/organisation-management/domains/custom/signicat-managed-certificate): Learn how to set up a custom domain with a Signicat-managed certificate
* [**Custom domain (Self-managed certificate)**](/docs/dashboard/organisation-management/domains/custom/self-managed-certificate): Learn how to set up a custom domain with a self-managed certificate
## Switch the certificate type
To learn how to switch the certificate type for your custom domain, see the guide below:
* [**Switch certificate**](/docs/dashboard/organisation-management/domains/custom/switch-certificate-type): Learn how to switch the certificate type for your custom domain
---
## Self-managed certificate
When you choose a **custom domain** that uses a **self-managed certificate**, you have more control over your certificates, such as choosing a Certificate Authority (CA), the type of certificate, and renewal times.
However, self-managed certificates require preparation. You must handle the following aspects:
- Obtaining and managing SSL/TLS certificates.
- Configuring your server, proxy and security settings to ensure secure communication. This may include setting up and configuring a reverse proxy to route traffic to Signicat.
- Handling certificate renewals and updates (Signicat notifies you when your certificate is about to expire).
- Monitoring and addressing any SSL/TLS errors or performance issues related to your custom domain.
:::tip Our recommendation
We recommend that you set up your custom domain during the development phase, before you go to production.
:::
## How to set up a custom domain (self-managed certificate)
To add a custom domain using a self-managed certificate, you need to complete the following steps:
1. Add your domain name in the Signicat Dashboard.
2. Configure the CNAME record with your DNS provider, so that traffic targeting your custom domain is forwarded to our servers.
3. Create a Certificate Signing Request (CSR) in the Signicat Dashboard.
4. Purchase an SSL/TLS certificate with a certificate authority (CA), using the CSR that you created in the previous step.
5. Upload the SSL/TLS certificate in the Signicat Dashboard that you purchased in the previous step.
To learn how to complete each step, see the corresponding sections below.
### 1. Add your domain name
You can add your domain name in the Signicat Dashboard. To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains).
2. In the top navigation bar, use the dropdown menu next to your organisation name to select the account that you want to make changes to.
3. In the top-right corner of the screen, click the **+ Add domain** button.
4. In the **Choose your domain type** dialogue box, click the **Custom domain** button. This takes you to the **Add custom domain** page.
5. In the **Domain name** field, enter your desired domain name. This must include both a root domain and a subdomain.
```https title="Example: Domain name"
app.mycompany.com
```
6. Under the **Choose your certificate type** section, select **Use self-managed certificate**.
7. Click the **Continue** button. You are then taken to the overview page for your new domain.
### 2. DNS setup
Before you can use the domain, you must configure the CNAME record with your DNS provider and then validate the DNS changes. To do this:
1. From the **Domain overview** page, see the **DNS setup** section.
:::tip Where can I find this?
To find the **Domain overview** page:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains).
2. For the domain that you want to configure, click the three dots under the **Actions** column.
:::
2. Under **Configure DNS** (step **1** in **DNS setup**), you can see both CNAME records that you need to configure with your DNS provider. Use the copy button beside the CNAME record to copy the value.
3. Go to your host domain provider's portal and paste the CNAME record in your domain's settings. You need to repeat this process so that both records are added.
4. Under **Validate DNS** (step **2** in **DNS setup**), click the **Validate DNS** button to validate your domain.
:::note Note
It can take some time for DNS updates to become available.
:::
### 3. Certificate setup
Before you can purchase an SSL/TLS certificate, you need to generate a Certificate Signing Request (CSR) in the Signicat Dashboard. This contains relevant information about your business that the Certificate Authority (CA) needs to verify your business identity.
You then need to share this CSR file with the Certificate Authority (CA) when purchasing the certificate. Once received, you need to upload the certificate in the Signicat Dashboard. To do this:
1. From the **Domain overview** page, see the **Certificate setup** section.
:::tip Where can I find this?
To find the **Domain overview** page:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains).
2. For the domain that you want to configure, click the three dots under the **Actions** column.
:::
2. Under **Create a Certificate Signing Request (CSR)** (step **1** in **Certificate setup**), click the **Generate CSR** button to open the **Generate CSR** dialogue box.
3. Fill in the fields in the form:
:::CustomTable
| **Field name** | **Description** | **Example** |
| :-- | :-- | :-- |
| Common name (CN) | The [fully qualified domain name (FQDN)](https://en.wikipedia.org/wiki/Fully_qualified_domain_name) to secure for your integration. | login.example.com |
| Organisation name (O) | Registered legal name of your organisation. | Example Org |
| Subject alternative name (SAN) | Optional. Comma-separated list of additional domains. | |
| Serial number (SN) | A number that uniquely identifies the certificate and is issued by the certification authority. | |
| Locality (L) | Town, city, village name. | Amsterdam |
| State or province (ST) | Province, region, county or state. | Noord-Holland |
| Country (C) | The [two-letter ISO country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) where your organisation is registered. | NL |
:::
4. To create and download the CSR, click the **Create** button, then click the **Download now** button.
```bash title="Example: CSR"
-----BEGIN CERTIFICATE REQUEST-----
...Base64-encoded string...
-----END CERTIFICATE REQUEST-----
```
:::tip Forgot to download the CSR?
You can also download the CSR at any time from the **Domain overview** page. To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains).
2. For the domain that you want to configure, click the three dots under the **Actions** column.
3. Under the **Create a Certificate Signing Request (CSR)** step in the **Certificate setup** section, click the **Download CSR** button beside the CSR that you want to download.
:::
5. Purchase a SSL/TLS certificate from a Certificate Authority (CA), using the CSR that you created in the previous step.
:::note Certificate types
The type of certificate that you need to purchase depends on requirements of the product that you are integrating with; it can be any combination of the following certificate types:
- Domain Validation (DV)
- Organization Validation (OV)
- Extended Validation (EV)
:::
6. Under **Upload certificate** (step **2** in **Certificate setup**), click the **Upload certificate** button.
7. Locate the file in your file system, then click the **Open** button to upload it.
:::tip Need help?
If you require assistance or need to report an issue, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
---
## Signicat-managed certificate
When you choose a **custom domain** that uses a **Signicat-managed certificate**, Signicat handles the following aspects:
- Creation (using [Let's Encrypt](https://letsencrypt.org/))
- Installation
- Renewal
:::note Note
The generated certificates are securely stored on Signicat servers and renewed automatically.
:::
## How to set up a custom domain (Signicat-managed certificate)
To add a custom domain using a Signicat-managed certificate, you need to complete the following steps:
1. Add your domain name in the Signicat Dashboard.
2. Configure the CNAME record with your DNS provider, so that traffic targeting your custom domain is forwarded to our servers.
To learn how to complete each step, see the corresponding sections below.
### 1. Add your domain name
You can add your domain name in the Signicat Dashboard. To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains).
2. In the top navigation bar, use the dropdown menu next to your organisation name to select the account that you want to make changes to.
3. In the top-right corner of the screen, click the **+ Add domain** button.
4. In the **Choose your domain type** dialogue box, click the **Custom domain** button. This takes you to the **Add custom domain** page.
5. In the **Domain name** field, enter your desired domain name. This must include both a root domain and a subdomain.
```https title="Example: Domain name"
app.mycompany.com
```
6. Under the **Choose your certificate type** section, select **Use Signicat-managed certificate**.
7. Click the **Continue** button. You are then taken to the overview page for your new domain.
### 2. DNS setup
Before you can use the domain, you must configure the CNAME record with your DNS provider and then validate the DNS changes. To do this:
1. From the **Domain overview** page, see the **DNS setup** section.
:::tip Where can I find this?
To find the **Domain overview** page:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains).
2. For the domain that you want to configure, click the three dots under the **Actions** column.
:::
2. Under **Configure DNS** (step **1** in **DNS setup**), you can see both CNAME records that you need to configure with your DNS provider. Use the copy button beside the CNAME record to copy the value.
3. Go to your host domain provider's portal and paste the CNAME record in your domain's settings. You need to repeat this process so that both records are added.
4. Under **Validate DNS** (step **2** in **DNS setup**), click the **Validate DNS** button to validate your domain.
:::note Note
It can take some time for DNS updates to become available.
:::
5. Following approval, [Let's Encrypt](https://letsencrypt.org/) reviews your DNS record using challenges, as defined by the ACME standard. If it matches your configuration, Signicat gets approval to request a certificate for your custom domain.
6. Following approval, Signicat requests and installs a certificate for your custom domain.
:::tip Need help?
If you require assistance or need to report an issue, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
---
## Switch certificate type
If you already have a domain but wish to change the type of certificate that it uses, then you can do this without downtime by following one of the procedures described below:
## Switch to a self-managed certificate
1. Add a new domain to your account using the steps shown on the custom domain [Self-managed certificate](/docs/dashboard/organisation-management/domains/custom/self-managed-certificate.mdx) page.
:::tip Tip
You can add a domain with the same host as an existing domain when you are changing the certificate type.
:::
2. Update your DNS records to match the required DNS records of the new domain.
3. Wait for the Signicat Dashboard to show your new domain as **Active** and the old domain as **Invalid DNS**.
4. The switch is now complete. You can clean up by deleting the old domain.
## Switch to a Signicat-managed certificate
1. Add a new domain to your account using the steps shown on the custom domain [Signicat-managed certificate](/docs/dashboard/organisation-management/domains/custom/signicat-managed-certificate.mdx) page.
:::tip Tip
You can add a domain with the same host as an existing domain when you are changing the certificate type.
:::
2. Configure the `_acme-challenge.` DNS record as shown in the Signicat Dashboard.
:::warning Important
Do not update your other DNS record yet.
:::
3. Once the `_acme-challenge` DNS record is configured, refresh the page in the Signicat Dashboard until it shows that the **TLS status** is **Ready**. This may take up to 15 minutes.
4. Update your other DNS record to match the required value shown in the Signicat Dashboard.
5. Wait for the Signicat Dashboard to show your new domain as **Active** and the old domain as **Invalid DNS**.
6. The switch is now complete. You can clean up by deleting the old domain.
---
## Domains
A domain is a pointer to the Signicat operational environment that determines the URL at which Signicat products and metadata are available.
Domains affect all frontend flows and locations of user interfaces where your end-users experience your services. This allows you to unify the user experience of your service with your company's brand, across Signicat products.
On this page, you can find information about what kind of domains are supported and how you can use your own domain name (also known as a CNAME or vanity URL).
:::warning Important
- For all backend communication with Signicat APIs, you must send requests to `api.signicat.com`. Signicat APIs are always hosted under Signicat domains.
- For OIDC and SAML, you must update your application's code to use the domain that you create.
:::
:::info Try it in the Signicat Dashboard
To manage your domains in the Signicat Dashboard, go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains).
:::
## Domain type
When you add a domain to your account, you can choose between a **Standard domain** or a **Custom domain** as described in the table below.
:::tip Some products require a custom domain
Certain products require a custom domain for integration and security purposes. To learn about if this is required, you can refer to the relevant product documentation.
:::
:::CustomTable{tableName="Overview of domain types" columnWidths="25% 50% 25%"}
| **Domain type** | **Description** | **Example** |
| :-- | :-- | :-- |
| Standard domain | Get set up without any changes to your DNS configuration, using a Signicat subdomain address. | `.app.signicat.com` |
| Custom domain | The URL visible to your end-users displays your brand only, instead of a Signicat subdomain. **Note**: This means that when an end-user logs in or signs documents, redirects to an external website throughout the process are not noticeable to them. | `..com` |
:::
### Set up a domain
To learn how to set up a domain for your account, make a selection using the buttons below:
* [**Standard domain**](/docs/dashboard/organisation-management/domains/standard): Learn about standard domains and how to set them up
* [**Custom domain**](/docs/dashboard/organisation-management/domains/custom/): Learn about custom domains and how to set them up
## Certificate type
When you add a custom domain to your account, you can choose between a **Signicat-managed certificate** or a **Self-managed certificate**.
:::info Want to learn more?
To learn more, see the [Certificate type](/docs/dashboard/organisation-management/domains/custom/index.mdx#certificate-type) section on the **Custom domains** page.
:::
## Certificate status
To learn what the different certificate statuses mean that you may encounter in the Signicat Dashboard, see the table below:
:::CustomTable{tableName="Overview of certificate statuses" columnWidths="25% 50% 25%"}
| **Certificate status** | **Description** | **Domain type** |
| :-- | :-- | :-- |
| Active | The certificate is active. | All types |
| Pending DNS validation | The DNS has not been validated. To validate it, you need to click the **Validate DNS** button on the **Domain overview** page in the Signicat Dashboard. **Note**: Once validated, the certificate is automatically provided. | Custom domain with Signicat-managed certificate |
| Missing | The certificate is missing for your custom domain. To add it, you need to upload it on the **Domain overview** page in the Signicat Dashboard. | Custom domain with self-managed certificate |
| Expired | The certificate has expired for your custom domain. To renew it, you need to upload a renewed one on the **Domain overview** page in the Signicat Dashboard. | Custom domain with self-managed certificate |
| Expires in `X` days | The certificate will expire in the specified number of days. To renew it, you need to upload a renewed one on the **Domain overview** page in the Signicat Dashboard. **Note**: This amount is always less than 30 days. | Custom domain with self-managed certificate |
:::
## DNS status
To learn what the different DNS statuses mean that you may encounter in the Signicat Dashboard, see the table below:
:::CustomTable{tableName="Overview of DNS statuses" columnWidths="25% 50% 25%"}
| **DNS status** | **Description** | **Domain type** |
| :-- | :-- | :-- |
| Ready | The DNS has been configured and validated. This means that it is ready to use. | All types |
| Not configured | The DNS has not been configured. | Custom domains |
| Not validated | The DNS has been configured, but it has not been validated. To validate it, you need to click the **Validate DNS** button on the **Domain overview** page in the Signicat Dashboard. | Custom domains |
:::
---
## Standard domain
A standard Signicat domain allows you to create your own label/subdomain under a Signicat domain.
The certificates for standard Signicat domains are created using [Let's Encrypt](https://letsencrypt.org/).
```https title="Example: Standard domain"
.app.signicat.com
```
## What does it look like?
The address of a standard Signicat domain varies depending on whether you are creating it for a sandbox account or a production account, as shown in the table below:
:::CustomTable{tableName="Standard domain variations" columnWidths="30% 70%"}
| Account type | Subdomain |
| :-- | :-- |
| Sandbox account | `.sandbox.signicat.com` |
| Production account | `.app.signicat.com` |
:::
## How to set up a standard domain
You can set up a standard Signicat domain for your account in the Signicat Dashboard. To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains).
2. In the top navigation bar, use the dropdown menu next to your organisation name to select the account that you want to make changes to.
3. In the top-right corner of the screen, click the **+ Add domain** button.
4. In the **Choose your domain type** dialogue box, click the **Standard domain** button. This takes you to the **Add standard domain** page.
5. In the **Domain name** field, enter your desired domain name, then click the **Add domain** button.
6. Optionally, you can set this as your default domain by clicking the **Set as default** button.
:::tip Update your code and configuration
Remember to update your application's code and configuration to point to the standard domain address that you have created.
:::
---
## Organisation management
The Signicat Dashboard lets you structure your resources into organisations and accounts. We offer tools for configuring and organising these resources and their domains.
To learn how to do this, see the guides below:
* [**Organisations**](/docs/dashboard/organisation-management/organisations): Learn how to add, manage and delete organisations
* [**Accounts**](/docs/dashboard/organisation-management/accounts): Learn how to create and delete sandbox and production accounts
* [**Domains**](/docs/dashboard/organisation-management/domains/): Learn how to add and manage standard Signicat domains and custom domains
* [**Company registration**](/docs/dashboard/organisation-management/company-registration/): Learn how to complete the company registration process
---
## Organisations
An organisation is the highest level of hierarchy in the Signicat Dashboard and represents a legal entity with a VAT number. This means that in most cases, you only need to create one which represents your company.
An organisation can have several accounts under it, since each account has its own domain, permissions and branding. To learn more about account types, visit the [Accounts](/docs/dashboard/organisation-management/accounts) documentation.
:::info Try it in the Signicat Dashboard
To manage your organisations in the Signicat Dashboard, go to **Signicat Dashboard** > [**Organisation**](https://dashboard.signicat.com/org-mgmt/).
:::
## Manage your organisation
When you register in the Signicat Dashboard, an organisation is automatically created for you. Your first organisation matches the name of your company that you submitted when signing up.
### Register your company details
To start using our products you must first register your company details in the Signicat Dashboard.
1. Log in to the [Dashboard](https://dashboard.signicat.com).
2. In the left-hand sidebar menu, select **Organisation**.
3. In the organisation management page, select **Company details**.
4. Select the **Country** where your company is registered and enter your **Company registration number**.
5. Select **Lookup** to verify the information.
{/* TODO: Add info about going live to prod */}
## Create an organisation
To create any extra organisation in the Signicat Dashboard, do the following:
1. Log in to the [Dashboard](https://dashboard.signicat.com).
2. Using the dropdown at the top left select **Create organisation**.
3. Enter a name for the new organisation and select **Create**.
Done! You can always add more organisations by repeating the steps above. The next step is to create an account that belongs to this organisation.
## Delete an organisation
:::note Before you continue
Before deleting an organisation, you must *permanently* delete all the accounts associated to the organisation you want to delete.
:::
To delete an organisation, do the following:
1. Log in to the [Dashboard](https://dashboard.signicat.com).
2. In the top navigation bar, use the dropdown menu next to view your organisations. Select **Manage** to view your organisation settings.
:::tip Show all
If your organisation is not listed in the dropdown menu, toggle **Show all** to display all organisations.
:::
3. In the Organisation management page, select **Delete** to delete your organisation.
:::warning Deleting an organisation
When you delete an organisation, the following happens:
- User memberships to the organisation are removed.
- User profiles stay active.
- Accounts, domains, credentials and resources under the organisation are permanently deleted.
Deleting an organisation is a permanent operation that cannot be undone.
:::
## Next steps
To start implementing solutions within your organisation, you must first add at least one account.
* [**Accounts**](/docs/dashboard/organisation-management/accounts): Learn how to create and delete sandbox and production accounts
---
## Audit logs
The Signicat **Audit logs** service allows you to query, view and filter audit log events.
:::info Try it in the Signicat Dashboard
To access the audit logs service, go to **Signicat Dashboard** > **Settings** > [**Audit logs**](https://dashboard.signicat.com/audit).
:::
## What are audit logs?
Audit logs provide you with documented evidence of the sequence of activities that have affected a system, from a security and quality perspective.
Activities are represented as events, and are shown for a selected account.
## Change the account
When viewing audit logs in the Signicat Dashboard, only the events for a selected account are shown. To change which account you are viewing audit logs for:
1. In the top navigation bar, expand the dropdown menu next to your organisation name.
2. Select the account that you want to view audit logs for.
## Show/hide columns
By default, there are five columns of data displayed for each event in the audit logs. To modify which columns are shown in this table:
1. From the [Audit logs](https://dashboard.signicat.com/audit) overview, click the **Columns** button.
2. Tick the boxes corresponding to the information that you would like to see as a column.
3. Click **Apply**.
:::tip Reset to default
To reset the look of the audit logs table to default:
1. Click the **Columns** button.
2. Click the **Default** button.
:::
## See event details
To see more details about a particular event:
1. From the [Audit logs](https://dashboard.signicat.com/audit) overview, click on any event in the table.
2. You are taken to a new page with event details.
- Under the **Summary** heading, there is key information about the audit log. You can add information as a filter from this view by clicking the corresponding filter button.
- Under the **Log data** heading, there is the event data in JSON format.
## Filter events
By default, all audit logs for your account are shown. You can apply filters to narrow down the events shown.
### Apply date range filter
To view events for a particular date range using the date filter:
1. From the [Audit logs](https://dashboard.signicat.com/audit) overview, expand the date dropdown menu to the top right of the table. By default, this is set to **Last 30 days**.
2. Set a date filter using either:
- The search field.
- One of the suggested ranges.
- The **Custom date** option.
### Apply custom event filters
To apply custom event filters using a range of different data parameters:
1. From the [Audit logs](https://dashboard.signicat.com/audit) overview, click the **Filters** button.
2. Tick the boxes for the filters that you would like to apply.
- Once you tick a box, you need to complete your selection with the required information presented in the user interface.
- Some filters are multi-select, whereas some require text input.
3. To save your changes, click the **Apply** button.
### Apply filters using previous events
To filter events based on a data parameter from a previous event:
1. From the [Audit logs](https://dashboard.signicat.com/audit) overview, click on any event in the table.
2. On the event details page, under the **Summary heading**, locate the filter that you want to apply.
3. Click the filter button to the right-hand side of that filter name.
### Apply filters from the audit log table
For some columns in the audit log overview table such as **Trace**, the filter tool is readily available from the event list. To apply the filter, click the filter button in the applicable column.
### Share the current filters
To share the currently applied filters with others such as your colleagues:
1. From the [Audit logs](https://dashboard.signicat.com/audit) overview, ensure you have applied all desired filters.
2. Copy the URL from your browser, and share this with the intended person.
### Clear the current filters
To clear all currently applied filters from the audit logs:
1. From the [Audit logs](https://dashboard.signicat.com/audit) overview, click the **Filters** button.
2. Click the **Clear** button.
## Export data
To export the audit logs to a CSV file:
1. From the [Audit logs](https://dashboard.signicat.com/audit) overview, click the **Export** button.
2. A CSV file containing all events that match the filters you have currently applied is downloaded.
## API integration
It is also possible for you to view your audit logs using our API.
To learn about how to do this, see our **Signicat Audit** API reference documentation. It contains information about available endpoints and properties, in addition to sample requests and responses.
* [**Signicat Audit API**](/apis/audit-logs/): Query, view and filter activities in the audit logs
---
## Events and webhooks
The Signicat **Events** service lets you create and manage subscriptions to events published by Signicat services.
:::info Try it in the Signicat Dashboard
To access the events service, go to **Signicat Dashboard** > **Settings** > [**Events**](https://dashboard.signicat.com/events).
:::
## What are events?
Events are our way of letting you know when something happens in one of our services. For example, when a document is signed, or if a change is made to your account, then we create an event.
Once you subscribe to an event, you automatically receive information about this event into your system.
We support delivering events using:
- Webhooks
- Microsoft Azure Service Bus
- Google Pub/Sub
- Signicat Mint
### Example use case
When a document is signed, your system automatically downloads the signed document. With an event subscription, you do not need to poll our APIs to determine when the documents are ready for download.
## What does an event look like?
An event contains nine fields, as illustrated in the table below.
Events follow the same structure across all Signicat services, with the exception of the event data (`eventData`) field. This field is given as a JSON object and varies depending on the type of event that is sent.
:::CustomTable{columnWidths="25% 50% 25%"}
| **Field name** | **Description** | **Type** |
| :-- | :-- | :-- |
| `id` | The ID of the event. | String |
| `timestamp` | The timestamp when the event was created. | ISO 8601 date string |
| `sender` | The service which is sending the event. | String |
| `eventName` | The name of the event. | String |
| `eventData` | The event data. You can see the structure of this for each event type in the Signicat Dashboard. | JSON |
| `accountId` | The account ID which the event is sent in the context of. | String |
| `organizationId` | The organisation ID which the event is sent in the context of. **Note**: This can be null. | String |
| `expiresAt` | The timestamp when the event expires. **Note**: There are no more retries after this timestamp. | ISO 8601 date string |
| `tags` | Optional tags that can be included in the event. **Note**: You add tags by setting them in the request to the service publishing the events. | String array |
:::
```json title="Example: Event when a sign order is completed"
{
"id": "82fa52a9bc7549438b8c6aee71569fa7",
"timestamp": "2023-11-13T11:38:10.7302363Z",
"sender": "signature-api",
"eventName": "order.completed",
"eventData": //Json object,
"accountId": "a-spge-IL9J9flqic18sh4TsUAo",
"organizationId": null,
"expiresAt": "2023-11-13T11:38:40.7302345Z",
"tags": [
"mock"
]
}
```
## Subscriptions
From the [**Subscriptions**](https://dashboard.signicat.com/events/subscriptions) page, you can:
- Create new subscriptions
- Manage existing subscriptions
- Test your events
### Subscription types
We support a variety of subscription types that you can use for event delivery. To learn more, see the sections below.
#### Webhooks
You can subscribe to certain events on your Signicat account by sending a payload to the webhook's configured URL, if you have a public endpoint that we can reach. To do this, see [Set up webhook](https://dashboard.signicat.com/events/subscriptions/setup/webhook) in the Signicat Dashboard.
The URL must respond with a HTTP status code of 200-299 within 15 seconds, otherwise the webhook delivery is considered failed and may be retried. For further details, see the [error handling](#error-handling) section.
##### Add a secret token
We recommend that you add a secret token to your webhook when creating the subscription. To do this:
1. On the [Set up webhook](https://dashboard.signicat.com/events/subscriptions/setup/webhook) page, tick the box marked **Secret**. A secret token is then automatically generated for you.
2. Copy the secret token. You can then use it to validate that the event payload is coming from Signicat.
##### Validate payloads
Using your secret token, we create a HMAC-SHA256 signature of the request body. All requests include a `X-Signicat-Signature` header containing this signature, which you then can use to validate the integrity of the payload and its origin.
To validate the request, compute the HMAC digest using your secret token as the signing key and ensure that it matches the signature from the header.
```js title="Example: How to generate signature with Node.js"
const crypto = require("crypto");
const secret = "your-secret-token";
// It is important to use raw request body and not deserialize it. Any added whitespace or ordering of properties will result in an invalid hash.
const payload = '{"message":"Hello, world"}';
const hmac = crypto.createHmac("sha256", secret);
const signature = hmac.update(payload).digest("hex").toUpperCase();
console.log(signature); // => DEF564B8DF06AE55C788493CB414068B2CF017385D96ECB39AA3E844FDBBCDEA
```
#### Azure Service Bus
You can subscribe to certain events on your Signicat account to push events to your Azure Service Bus queue. To do this, see [Set up Azure Service Bus](https://dashboard.signicat.com/events/subscriptions/setup/azureservicebus) in the Signicat Dashboard.
#### Google Pub/Sub
You can subscribe to certain events on your Signicat account to push events to your Google Pub/Sub topic. To do this, see [Set up Google Pub/Sub](https://dashboard.signicat.com/events/subscriptions/setup/googlepubsub) in the Signicat Dashboard.
#### Signicat Mint
You can subscribe to certain events on your Signicat account to trigger a Mint flow. To do this, see [Set up Mint](https://dashboard.signicat.com/events/subscriptions/setup/mint) in the Signicat Dashboard.
### Add a subscription
1. From the [**Events**](https://dashboard.signicat.com/events) overview, click the **Add subscription** button.
2. Select a subscription type from the list of connections.
:::info Want to learn more?
To learn more about specific subscription types, see the [Subscription types](#subscription-types) section.
:::
3. Complete the required information specific to that connection type.
:::tip How do tags work?
Optionally, you can add tags in the **Tag filter** field. This means that we then only forward events that include the specified tags.
- The event has to include all of the specified tags in the tag filter in order for it to be forwarded.
- If you end the tag with an asterisk, it picks up all events that start with that tag. For example, the tag `test-*` picks up events that start with `test-tag` or `test-event`.
:::
4. Click the **Add** button to create the subscription.
### Manage a subscription
To make changes to existing subscriptions that you have set up:
1. From the [**Subscriptions**](https://dashboard.signicat.com/events/subscriptions) overview, click on the subscription that you want to make changes to.
2. On the subscription details page, make your desired changes.
3. To save your changes, click the **Update** button.
### Test your events
Our event testing feature makes it possible to test certain events from the Signicat Dashboard. This means that:
- When you are integrating, you can create a mock event instead of triggering the actual event.
- You can test your subscriptions and event code handling.
To use this feature:
1. From the [**Subscriptions**](https://dashboard.signicat.com/events/subscriptions) overview, click the **Test events** button.
2. Select a subscription from the first dropdown menu.
3. Select an event type from the second dropdown menu.
4. Click **Send**.
:::note Success!
You have now created a mock event. You can view the request body that has been produced for this mock event, so that you can see how it looks before you test.
:::
## Events
From the [**Events**](https://dashboard.signicat.com/events) page, you can:
- View a list of your event deliveries from the events that you have subscribed to.
- View the details of a particular event by clicking on it. Here, you can find the request and response body for the event.
### Event types
The list of event types that we support is constantly evolving. You can see the full list of supported events available when you set up a new subscription. To do this:
1. From the [**Events**](https://dashboard.signicat.com/events/events) overview, click the **Add subscription** button.
2. Choose the subscription type that you want to set up.
3. Click the **Selected events** radio button under the **Listen to** section.
#### Preview the JSON payload
You can preview what the JSON payload looks like for each event when you set up a new subscription. To do this:
1. When seeing the full list of events as described above, click the **Preview** button next to the event that you would like to preview.
2. The JSON payload appears on the right-hand side.
## Error handling
An event delivery is considered failed if we are unable to deliver the event. This includes network issues, timeouts and HTTP status codes other than `200-299`.
- In general, failures caused by network errors are retried, whereas failures caused by misconfiguration are not retried. This means that only HTTP status codes of `429` and `500-599` are retried.
- If a webhook responds with the HTTP status code `410 Gone`, then the subscription is disabled and no further events are delivered.
- The time between each delivery attempt starts at approximately one second and rapidly increases towards 24 hours, for up to five days.
- If a webhook responds with a `Retry-After` header, then the next delivery attempt is not be retried for at least the duration specified in the header.
## API integration
It is also possible for you to manage your event subscriptions using our API.
To learn about how to do this, see our **Signicat Events Management** API reference documentation. It contains information about available endpoints and properties, in addition to sample requests and responses.
* [**Signicat Events Management API**](/apis/events/): Create and manage subscriptions to events published by Signicat services
---
## Settings
To learn how to manage advanced settings in the Signicat Dashboard, see the guides below:
* [**Audit logs**](/docs/dashboard/settings/audit-logs): Learn how to manage audit log events
* [**Events and webhooks**](/docs/dashboard/settings/events): Subscribe to events published by Signicat services
---
## Support
The Signicat **Support ticket** service lets you to create and manage support tickets so that you can contact our experts us with any queries.
For example, you may require:
- Customer support
- Invoice support
- Onboarding support
- Signicat Spain support
:::note Note
The **Signicat Spain support** option only applies if you were directly notified to use it.
:::
## Accessing the service
To access the support ticket service, you need to have signed up to the Signicat Dashboard, as this is where you manage and create tickets:
* [**Create ticket**](https://dashboard.signicat.com/contact-us/tickets/new): Create a new support ticket in the Signicat Dashboard
* [**Manage tickets**](https://dashboard.signicat.com/contact-us/tickets): View and manage your support tickets in the Signicat Dashboard
### What roles do you need?
To help determine what roles you need for accessing the support ticket service, you can reference the table below:
:::CustomTable{columnWidths="25% 75%"}
| **Required role** | **Description** |
| :-- | :-- |
| Support Viewer | Has access to view support tickets and comments. |
| Support Sensitive Viewer | Has access to view support tickets and comments. This includes sensitive data. |
| Support Editor | Has access to create, update and view support tickets and comments. This includes sensitive data. |
| Organisation Viewer | Has access to view all resources and configurations for the organisation, except for sensitive fields such as passwords and API secrets. |
| Organisation Admin | Has access to: Create, update and delete accounts and configurations. Invite and administer users for the organisation and child accounts. |
:::
### Applying the role
Support tickets are defined at either an organisation-level scope or an account-level scope.
This means that when you assign a support role such as **Support Viewer**, **Support Sensitive Viewer**, or **Support Editor**, you must apply it at the appropriate scope:
:::CustomTable{columnWidths="25% 75%"}
| **Scope** | **Description** |
| :-- | :-- |
| Organisation level | Applying a role at an organisation level grants the user access to tickets for the entire organisation, including all of the corresponding accounts defined under it. |
| Account level | Applying a role at an account level limits the user's access to tickets for only that specific account (or accounts). |
:::
:::note Note
The tickets you see in the Signicat Dashboard depend on the scope that you have selected.
To make a change, click your organisation name in the top navigation bar to expand the dropdown menu, then select the organisation or account that you want to view support tickets for.
:::
### Issues logging in?
If you need help with an issue that is preventing you from logging into the Signicat Dashboard, then you can submit a request to our support team with the **Access & User Administration** form by clicking on the button below.
Our support team will then assist you with resetting your authentication.
:::info Who can use this form?
You can only use this form for specific administrative requests, such as if you need to reset two-factor authentication (2FA) or if you need to reactivate your user for the Signicat Dashboard.
:::
* [**Access & User Administration form**](https://admin.support.signicat.com/hc/en-us/requests/new): Create a new request with the Access & User Administration form
## How to create a support ticket
1. Go to **Signicat Dashboard** > [**Contact Us**](https://dashboard.signicat.com/contact-us/tickets), then click the **+ Create ticket** button.
2. As you have already selected the organisation and account that you are creating a ticket for, the following details will be prefilled automatically:
- Organisation ID
- Organisation name
- Account name
- Account ID
3. Using the **Category** dropdown menu, select the type of support ticket that you want to submit.
4. Using the **Product** dropdown menu, select the product which the support ticket relates to.
5. In the **Subject** field, add a descriptive title for your support ticket.
6. In the **Message** field, describe what you would like assistance with.
:::warning Sharing sensitive data
Do not share any personal identifiable information (PII) in this field. Sensitive information must only be shared as attachments.
:::
7. To upload attachments, click the **Attach** button under the **Upload files** section.
- To share sensitive information as an attachment, you must also tick the checkbox **This ticket contains sensitive data**.
- Any subsequent attachments submitted for your tickets are considered sensitive by default, to prevent you from accidentally submitting any sensitive information.
:::note Maximum file size
The sum of all file sizes must not exceed 10 MB.
:::
8. To submit your ticket, click the **Submit** button.
## How to manage your support tickets
1. Go to **Signicat Dashboard** > [**Contact Us**](https://dashboard.signicat.com/contact-us/tickets). Here, you can see a list of all support tickets that you have submitted for the given organisation.
2. Use the relevant dropdown menus, buttons and fields to filter and order your support ticket using the following parameters:
- Filter by:
- The category of support tickets.
- The product that the support tickets relate to.
- The status of the support tickets.
- The time frame that the tickets were submitted within.
- Order by:
- The timestamps when the issues were submitted (ascending or descending).
- The timestamps when the issues were last updated (ascending or descending).
## How to share your support tickets
If you want to share the contents of a support ticket with a colleague, then there are two methods to do this.
:::tip Our recommendation
We recommended that you use the [watchers functionality](#using-the-watchers-functionality) in the Signicat Dashboard.
:::
### Using the watchers functionality
Once created, a ticket can have one or multiple watchers added.
:::note Note
Adding a watcher is for informative purposes only. It does not imply sending an invitation to the organisation or account, or granting a role for the support ticket service.
:::
To add a user as a watcher:
1. Go to **Signicat Dashboard** > [**Contact Us**](https://dashboard.signicat.com/contact-us/tickets).
2. From the tickets overview page, select the ticket that you want to add a watcher to. This takes you to the ticket details page.
3. Click the **Watchers** button, then click the **+ Add Watchers** button.
4. Enter the email address of the person that you want to add as a watcher.
5. To confirm, click the **Add as a watcher** button.
Once a user is added as a watcher, they will then receive ticket status updates as they occur by email.
The email update contains the updated ticket status, ticket subject, and a link to the ticket in the Signicat Dashboard.
:::warning Important
You can only view the ticket contents in the Signicat Dashboard if you have access to the organisation or account, and have the necessary role.
:::
### Using a link
As an alternative to using the watchers functionality within the Signicat Dashboard, you can also send the ticket as a link by copying it manually and sending it over your preferred messaging/email platform.
:::tip Tip
The link must contain the complete `scopeId`. To ensure this, you can copy and paste the entire link for the ticket from your web browser's address bar.
:::
To see the ticket, the person receiving the link needs to have the necessary access rights in the Signicat Dashboard, at the given scope.
```https title="Example: Link to support ticket"
https://dashboard.signicat.com/contact-us/tickets/{ticket-id}?scopeId=a-page-xxxxxxxxxxx
```
---
## TLS compatibility
To meet strict security and compliance standards, all connections to Signicat require [TLS 1.2](https://datatracker.ietf.org/doc/html/rfc5246) or [TLS 1.3](https://datatracker.ietf.org/doc/html/rfc8446.html).
## Supported cipher suites
Your client must support at least one of the following strong cipher suites to connect successfully. For TLS 1.2, the negotiated cipher depends on the type of certificate used:
### TLS 1.3
* `TLS_AES_128_GCM_SHA256`
* `TLS_AES_256_GCM_SHA384`
### TLS 1.2
* `TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256` *(EC certificates)*
* `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` *(RSA certificates)*
* `TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384` *(EC certificates)*
* `TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384` *(RSA certificates)*
## Supported elliptic curves
For key agreement, the following elliptic curves are supported:
* `P-256`
* `P-384`
## Troubleshooting connectivity
We strongly recommend configuring your clients and integrations to use the latest secure protocols and ciphers to maintain a stable connection to our platform.
If your application experiences connectivity issues or handshake failures when connecting to Signicat, verify that your HTTP client or network infrastructure is configured to use at least TLS 1.2 alongside the supported cipher suites and curves listed above.
---
## API overview for Data Verification API
# API overview
This overview of the API covers key information to help you understand the API, and its endpoints.
The Data Verification API returns normalised data from carefully-selected sources, making it easy for you to interpret and use the responses regardless of the source.
You can find the full list of endpoints in the [Data Verification API reference](/apis/data-verification/).
:::tip Coverage
For an overview of all data sources and countries available by endpoint, visit the [Coverage](/docs/data-verification/coverage.mdx) page.
:::
## Endpoints for natural persons
### Account holder
The [Account holder endpoint](pathname:///apis/data-verification/#tag/Persons/operation/Person_VerifyAccountNumber_GET) allows you to verify if a specific bank account exists and if the name of its owner matches the name you provide. Depending on the source, either IBAN or account number can be provided as input.
### Basic information
The [Basic endpoint](pathname:///apis/data-verification/#tag/Persons/operation/Person_GetBasic_GET) contains basic information about a person like name, address (specifying multiple types of address if registered in the data sources, such as postal, permanent, foreign), date of birth (including place of birth), citizenship (multiple citizenship, if any), and nationality.
### Finance
The [Finance endpoint](pathname:///apis/data-verification/#tag/Persons/operation/Person_GetFinance_GET) can be used to retrieve financial information about a person. For example, their credit score and information about their income and wealth.
### Identity verification
The [Identity verification endpoint](pathname:///apis/data-verification/#tag/Persons/operation/Person_VerifyAddress_GET) can be used to verify a natural person's identity and address information.
The endpoint returns a value (`identified`, `partiallyIdentified`, `notIdentified`) to confirm whether a given person's identity and address attributes provided in the API request match the data found in the registries.
Use this endpoint to perform checks for data consistency that include checking the given address and identity attributes, such as the combination of name, surname and residential address, against the available data sources. For example, you can use this endpoint if you already know someone's address and need to perform enhanced due diligence to verify the person and address authenticity.
### Screening
The [Screening endpoint](pathname:///apis/data-verification/#tag/Persons/operation/PersonGlobal_Screening_GET) provides information about whether the person in question is:
- a PEP (politically exposed person)
- on a sanction list
- on an adverse media list
#### PEP
A politically exposed person is someone who has a prominent public function and, thus, presents a higher risk of involvement in, for example, bribery or corruption. Family members or close associates of such people are also considered PEPs. It is important to be aware of the PEP status of one's customers in order to apply any precautions that may be necessary.
Signicat covers the following standard PEP lists:
- The Acuris C6 global PEP list
- PEP Edge (detailed coverage of Nordic PEPs, where [Trapets](https://www.trapets.com/) is the editor)
#### Sanction lists
Sanction lists are created by one or more countries or public bodies to apply commercial or financial penalties to individuals, groups, or entire countries. For example, the EU has sanctions that involve freezing the funds and economic resources of specific natural persons and organisations.
To observe these restrictions properly, it is important to check that your customers are not included in any sanction lists.
Signicat covers the following standard sanction lists:
- EU Consolidated list of persons, groups, and entities subject to EU financial sanctions.
- UN consolidated
- OFAC Specially Designated Nationals
- HM Treasury - consolidated list of financial sanctions
Optionally, local national sanction lists can be enabled on request.
### Search
With the [Search endpoint](pathname:///apis/data-verification/#tag/Persons/operation/PersonGlobal_Search_GET), you can search for a person's ID number using several parameters, such as name and date of birth.
:::warning Beta
This endpoint is in beta. Its functionality is subject to change without prior notice.
:::
## Endpoints for organisations
### Account holder (org)
The [Account holder endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_VerifyAccountNumber_GET) allows you to verify if a specific bank account exists and if the name of its owner matches the company name you provide. Depending on the data source, you can make a request with either:
- IBAN
- Account number
The usage of query parameters in this endpoint varies based on the source and country where you want to verify an IBAN or an account number.
The following table shows how to use the query parameters:
:::CustomTable{columnWidths="25% 75%"}
| Parameters | Description |
| --------------- | ------------------ |
| `accountNumber` | The account number or IBAN number that you want to verify. This is a required parameter. |
| `idList` | The company ID, branch ID and VAT number of the organisation, that you want to verify together with the IBAN number. This parameter is specific to **Surepay** data source. Available values per country: Netherlands: `NL_KVK`, `NL_KVK_BRANCH`, `EU_VAT`France: `FR_SIREN`, `FR_SIRET`Italy: `EU_VAT`. For Italy, sending the `EU_VAT` number for IBAN validation is mandatory.UK: `UK_CRN` The `idList` format is: `, ` (e.g `NL_KVK, 012345678`). |
| `idType` | The type of `accountNumber` that is being validated. If not specified, `IBAN` is used by default. This is specific to Surepay data source. |
| `name` | Name of the organisation to verify. |
| `country` | The country code (ISO 3166-1 format) under consideration for IBAN verification. For example, to verify an IBAN from Netherland, then use country code `NL`. This parameter determines the country used in the `idList` parameter. This is a required parameter. |
:::
**Example**
The following API request example can be used to verify an IBAN together with the name of an organisation (`name`), KVK number (`NL_KVK`), KVK branch number (`NL_KVK`) and VAT number (`EU_VAT`).
```bash
https://api.signicat.com/info/lookup/countries/NL/organizations/accountnumber/NL72ABCD1236548754/verify?
&name=We care 4 U
&idType=IBAN
&idList=NL_KVK, 01234565
&idList=NL_KVK_BRANCH, 012345698124
&idList=EU_VAT, NL1245658
```
**Parameters overview**
:::tip Add a parameter
To verify any additional parameter (together with the IBAN), you must specify the parameters in the _query string_ of the URL in your API request. For example, `https://api.signicat.com/info/lookup/countries/NL/organizations/accountnumber//verify?name=&idType=IBAN&idList=`.
:::
### Basic information (org)
The [Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetBasicOrganizationInfo_GET) provides standard information about an organisation like trade name, address, organisation type, legal status, and industry sector.
### Ownership (org)
The [Ownership endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetOwnership_GET) provides information about the owners of an organisation. Owners of an organisation can be natural persons or other organisations.
### UBO (org)
The [UBO endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetUbo_GET) provides information about the Ultimate Beneficiary Owner (UBO) of an organisation.
UBO is a term used to describe the natural person who is the ultimate effective owner of an organisation, even if that person is not a direct owner of that organisation. For example, imagine a case where the company you need more information about is owned by another company, which is owned by a natural person. This UBO wouldn't appear in the ownership attribute, since they are not a direct owner of the company.
Establishing the UBO can be challenging, especially when ownership is distributed over different countries or passes through countries like Liechtenstein or Bermuda.
As defined by the [4th EU AML directive](https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32015L0849&from=EN), a UBO is any natural person who, directly or indirectly:
- holds at least 25% plus one share of the share capital, or
- exercises at least 25% of the voting rights, or
- is the beneficiary of at least 25% of the legal entity's capital
Note that this definition has been simplified and you should review the directive if you want to know more. Also, note that each country may define even lower thresholds, according to which a natural person can be considered a UBO, so it is always important to review the domestic laws applicable.
#### Key terms (org)
This section summarises some terms related to UBO that are used in the Data Verification API.
- **Direct ownership**: This is the simplest ownership model. A person or entity is considered a direct owner of an organisation if they do not own it through another entity.
- **Indirect ownership**: A person or entity is considered an indirect owner of an organisation if they own an entity that, in turn, owns the organisation we are interested in. For instance, if John owns (or partially owns) Company A, and Company A is a direct owner of Company Z, that makes John an indirect owner of Company Z as well. Indirect ownership can have one or multiple paths: extending our example above, if John also owns a second company, Company B, and this entity is a part-owner of Company Z, that makes John the indirect owner of Company Z through two different paths. This will also affect how the indirect ownership percentage is calculated.
- **Integrated ownership**: The sum of direct and indirect ownership a person or other entity has in a specific company (source: [T-rank](https://docs.trank.no/white_papers/t-rank_white_paper_indirect.pdf))
- **Voting rights**: Rights granted to a person or entity in connection with how many shares they own in an organisation. There typically is a direct correlation between shares owned and voting rights: if John owns 20% of the shares of Company A, his vote is worth 20%. However, note that voting rights can be restricted or expanded by using different types of shares (_share classes_). For example, one could define share classes which only give the right to receive financial returns on the investment, but without the right to vote at the shareholders' assembly.
- **Voting power**: A part-owner of an organisation can have more or less voting power based on how much they can impact a vote in different scenarios. Voting power is not directly correlated to shares owned (when those shares give the right to vote at the shareholders' assembly). For example, consider an organisation with three shareholders, two of which hold 49.5% of the shares each, with the third one, Natalie, holding only 1% of the shares. In any voting scenario in which the other two shareholders don't agree, Natalie will always sway the vote, which gives her a voting power of 50%.
#### Related links (org)
The following links might be useful if you want to learn more about how different ownership models are calculated:
- [Exploring integrated ownership: direct, indirect and multiple-path](https://www.bvdinfo.com/en-gb/blog/compliance-and-financial-crime/exploring-integrated-ownership-direct-indirect-and-multiple-path), by Bureau Van Dijk.
- [Integrated Ownership Calculation](https://docs.trank.no/white_papers/t-rank_white_paper_indirect.pdf) (pdf), by T-rank.
### Roles (org)
The [Roles endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetRoles_GET) provides the personal details of natural persons who have a registered role within an organisation, such as board members and daily management. In addition, this step returns information about external third-party service providers, such as accountancy and bookkeeping firms.
### Authorisations (org)
The [Authorisations endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetAuthorization_GET) tells you about persons or organisations ("signees") who have been authorised to act on behalf of the organisation on a certain matter ("mandate").
We identify two different types of authorisation:
- Signing rights, covering people with authorisation to sign and to act on behalf of the business in **all** matters.
- Power of procuration, people with the authorisation to sign and to act on behalf of the business in specific, **limited** matters.
For both types of authorisation, we try to generate all possible combinations of required persons to achieve a certain mandate. This makes it easy for you to do automatic checks on mandates. You could for example automatically check the validity of a signed document by checking the signees with the list we provide (for the applicable mandate). If we cannot establish the possible combinations of persons (for a specific mandate), we will inform you about the mandates of individual signees.
**Special cases**
For Swedish organisations with business type _Aktiebolag_ (limited company), if the company only consists of one board member and one deputy board member - this is the minimum requirement for a limited company - the only board member has the right to sign himself for the company. Visit the [Swedish Companies Registration Office (Bolagsverket)](https://bolagsverket.se/foretag/aktiebolag/startaaktiebolag/firmateckningiaktiebolag.519.html) website for more details.
### Screening (org)
The [Screening endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Screening_GET) tells you if the organisation is mentioned on any sanction lists.
Sanction lists are created by one or more countries to apply commercial or financial penalties to individuals, groups, or entire countries. For example, the EU has sanctions that involve freezing the funds and economic resources of specific natural persons and organisations.
To observe these restrictions properly, it is important to check that your customers are not included in any sanction lists.
### Finance (org)
The [Finance endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetFinance_GET) allows you to retrieve some financial information about an organisation. This includes information such as their credit rating and yearly profit/turnover figures.
### Search (org)
With the [Search endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Search_GET), you can search for an organisation by name in cases when the organisation number is not available. The response returns all organisations (together with the address details) that match the name sent in the request.
### About the ID parameter in organisation endpoints
Most organisation endpoints in the Data Verification API have two required path parameters:
- `country`
- `id`
These parameters serve to narrow down the organisation that you want to obtain information about. There is only one way to use the `country` parameter (by entering an ISO 3166-1 country code), but several in the case of `id`.
There are three different types of IDs that can be used to identify an organisation:
- `organization`: the ID of the organisation as stated in the relevant national registry. This is the default option. Not always unique.
- `tax`: the tax ID of the organisation as stated in the relevant tax registry. For example, EIN in the US.
- `external`: the ID assigned to the organisation by the source that provides organisational information. Always unique.
You can specify which type of ID you want to use in your request with the `idType` query parameter. In some cases, you can skip this and let the API use the default option (`organization`). You can use the default option if the organisation is registered in a country where organisation numbers are unique, such as Norway or Sweden. In countries where organisation numbers are not unique, like the US or Germany, you could get multiple hits when you try to use the organisation number. If this happens, we suggest using the tax ID or external ID as an alternative. An example of an external ID is the DUNS number (assigned by Dun & Bradstreet) or the BvD ID (assigned by Bureau van Dijk).
#### How to look up organisations using a tax or external ID
If you can't use an organisational ID, you can find out a company's tax ID or external ID with the Search endpoint of the Data Verification API. Therefore, there are two main steps:
1. Use the [Search endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Search_GET) to find the company you are interested in. Extract the `externalId` or `taxNumber` from the response.
2. Use the extracted ID on any of the other organisation endpoints to find the information you want.
What follows is an example of how to find the ultimate beneficial owners of a fictional German company called "Nunstück GmbH". Note that all information used here is fictional.
1. Use the [Search endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Search_GET) to find the company you are interested in. It helps to use several parameters to refine your search. For our example, we enter `Nunstück` as the `name` and `DE` in `countries`. If you know the organisation number, it helps to use it here (in the `id` parameter). Even though it isn't unique, using it together with the name increases the likelihood of getting a single result in the response.
2. Review the API response. If there are several results, identify the company you're interested in based on the `data` of each result.
3. Find Nunstück's `taxNumber` or `externalId` in the `data` array of the response. For this example, we use the external ID.
4. Use the [Ultimate beneficial owners endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetUbo_GET) to find out the information you need. Enter `DE` as the `country`, the external ID obtained in the previous step as the `id`, and `external` as the `idType`.
The response will contain information about the ultimate beneficial owners of Nunstück GmbH.
The images below show two examples of how to use the `idType` parameter:
---
## Code examples for Data Verification
# Code examples
This page guides you through the steps to build a simple application to integrate with the Signicat Data Verification API using .NET 8.0.
The code examples show how to set up a minimal ASP.NET Core project to fetch basic information about persons and organisations from the API using token-based authentication.
Here are the steps that you will follow:
1. Connect to the Data verification API
2. Prepare your development environment
3. Authenticate to the Data Verification API
4. Call the Organisation and Person Basic endpoints with test data
5. Review the API response
You can extend the code examples in this guide to cover other scenarios by using the sources documented on the [Data sources](/docs/data-verification/data-sources/) pages.
## Connect to the Data Verification API
Before you can start making requests to this API, you need to learn how to connect to it. To do this, follow steps 1-3 in the **Connect to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::note What permissions are required?
Ensure that you set the following permissions for your API client:
- **Data Verification for natural persons** to connect to data sources about natural persons.
- **Data Verification for organisations** to connect to data sources about organisations.
:::
Then, return here and continue with the next steps of this guide.
## Prepare your development environment
Before you begin, ensure that you have the following tools installed in your development machine:
- [.NET SDK 8.0](https://dotnet.microsoft.com/download/dotnet/8.0)
You will need the .NET CLI to run this example, read more about it at [https://learn.microsoft.com/en-us/dotnet/core/tools/](https://learn.microsoft.com/en-us/dotnet/core/tools/).
## Clone and configure the project
### Clone the code
Clone the repository to your local machine using the following command:
```bash
git clone https://github.com/signicat/sample-data-verification
```
Or, download the code compressed in a zip file:
* [**Download full code example**](https://github.com/signicat/sample-data-verification/archive/refs/heads/main.zip)
The full code example includes all the files you need to run the sample application.
:::details Preview application code
```dotnet
// Create a new WebApplication
var builder = WebApplication.CreateBuilder(args);
// Configure in-memory settings for TokenService
var inMemorySettings = new List> {
new("TokenServiceConfig:GrantType", "client_credentials"),
new("TokenServiceConfig:Scope", "signicat-api"),
new("TokenServiceConfig:ClientId", ""),
new("TokenServiceConfig:ClientSecret", "")
};
// Build configuration from in-memory settings
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(inMemorySettings)
.Build();
// Configure TokenServiceConfig using the built configuration
builder.Services.Configure(
configuration.GetSection("TokenServiceConfig"));
// Configure HttpClient for TokenService
builder.Services.AddHttpClient("TokenService", httpclient => {
httpclient.BaseAddress = new Uri("https://api.signicat.com/auth/open/");
});
// Add TokenService as a singleton service
builder.Services.AddSingleton();
// Configure HttpClient for DataVerificationApiService
builder.Services.AddHttpClient("DataVerificationApiService", httpclient => {
httpclient.BaseAddress = new Uri("https://api.signicat.com/info/lookup/");
});
// Add DataVerificationApiService as a singleton service
builder.Services.AddSingleton();
// Build the application
var app = builder.Build();
// Set up a simple root route
app.MapGet("/", () => "Signicat Data Verification Sample App.");
// Set up routes for person and organization information
var person = app.MapGroup("/person");
person.MapGet("/basic/{country}/{source}/{id}", GetPersonBasic);
var organization = app.MapGroup("/organization");
organization.MapGet("/basic/{country}/{source}/{id}", GetOrganizationBasic);
// Run the application
app.Run();
// Handler for getting basic person information
static async Task GetPersonBasic(string country, string source, string id, DataVerificationApiService dataVerificationApiService)
{
var response = await dataVerificationApiService.GetPersonBasic(country, source, id);
return TypedResults.Ok(response);
}
// Handler for getting basic organization information
static async Task GetOrganizationBasic(string country, string source, string id, DataVerificationApiService dataVerificationApiService)
{
var response = await dataVerificationApiService.GetOrganizationBasic(country, source, id);
return TypedResults.Ok(response);
}
```
```dotnet
// DataVerificationApiService class to handle API requests for person and organization information
public class DataVerificationApiService(IHttpClientFactory httpClientFactory, TokenService tokenService)
{
// Get basic person information from the API
public async Task GetPersonBasic(string country, string source, string id)
{
return await MakeRequest($"countries/{country}/persons?identityNumber={id}&source={source}");
}
// Get basic organization information from the API
public async Task GetOrganizationBasic(string country, string source, string id)
{
return await MakeRequest($"countries/{country}/organizations/{id}?source={source}");
}
// Helper method to make an authenticated API request
private async Task MakeRequest(string url)
{
var httpClient = httpClientFactory.CreateClient("DataVerificationApiService");
// Get an authentication token from the TokenService
TokenResponse? token;
try
{
token = await tokenService.GetToken();
if (token == null) return "Something went wrong fetching the authentication token";
}
catch (Exception ex)
{
return ex.Message;
}
// Set the authorization header with the access token
httpClient.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token.AccessToken);
// Make the API request
var httpResponseMessage = await httpClient.GetAsync(url);
// Handle the API response
if (!httpResponseMessage.IsSuccessStatusCode)
{
if (httpResponseMessage.StatusCode == System.Net.HttpStatusCode.NotFound)
return "The entity you tried to look up was not found at the source.";
else
return httpResponseMessage.StatusCode + ", " + httpResponseMessage.ReasonPhrase;
}
// Read and return the response content
var responseContent = await httpResponseMessage.Content.ReadAsStringAsync();
return responseContent;
}
}
```
```dotnet
using System.Text.Json.Serialization;
// TokenResponse class representing the token response
public class TokenResponse
{
[JsonPropertyName("access_token")]
public string? AccessToken { get; set; }
}
```
```dotnet
using Microsoft.Extensions.Options;
// TokenService class to handle authentication token requests
public class TokenService(IHttpClientFactory httpClientFactory, IOptions configuration)
{
private readonly TokenServiceConfig _configuration = configuration.Value;
// Get an authentication token from the token service
public async Task GetToken()
{
var httpClient = httpClientFactory.CreateClient("TokenService");
// Prepare the request content with client credentials
var requestContent = new List>
{
new("grant_type", _configuration.GrantType),
new("scope", _configuration.Scope),
new("client_id", _configuration.ClientId),
new("client_secret", _configuration.ClientSecret)
};
// Make the token request
var httpResponseMessage =
await httpClient.PostAsync("connect/token", new FormUrlEncodedContent(requestContent));
// Handle the token response
if (!httpResponseMessage.IsSuccessStatusCode)
throw new Exception(httpResponseMessage.StatusCode.ToString());
// Read and deserialize the token response
var responseContent = await httpResponseMessage.Content.ReadAsStringAsync();
return System.Text.Json.JsonSerializer.Deserialize(responseContent);
}
}
```
```dotnet
// TokenServiceConfig class representing configuration properties
public class TokenServiceConfig
{
public string? GrantType { get; set; }
public string? Scope { get; set; }
public string? ClientId { get; set; }
public string? ClientSecret { get; set; }
}
```
:::
:::note Limitations of the code example
The code used in this sample application is meant to be easy to understand and may not follow best practices. Make sure your code adheres to coding and security standards, when preparing your applications for production.
:::
### Configure the credentials
To make requests to the API endpoints, the application first needs to authenticate to the Signicat authorisation server using your API client credentials.
Edit the API client credentials, the client ID and the client secret, in the `Program.cs` file.
Replace `` and `` with the values of your API Client.
```dotnet {5-6}
// Configure settings for TokenService
var inMemorySettings = new List> {
new("TokenServiceConfig:GrantType", "client_credentials"),
new("TokenServiceConfig:Scope", "signicat-api"),
new("TokenServiceConfig:ClientId", ""),
new("TokenServiceConfig:ClientSecret", "")
};
```
## Authenticate to the API
To make requests to the API, you first need to obtain an access token.
To do this, you need to call the `https://api.signicat.com/auth/open/connect/token` address with your client credentials in the request content. Then, the authorisation server provides your application with a token that can be used to interact with the API.
The `TokenService` class handles the request to the Signicat API authorisation server, as shown below:
```dotnet
// TokenService class to handle authentication token requests
public class TokenService
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly TokenServiceConfig _configuration;
public TokenService(IHttpClientFactory httpClientFactory, IOptions configuration)
{
_httpClientFactory = httpClientFactory;
_configuration = configuration.Value;
}
// Get an authentication token from the token service
public async Task GetToken()
{
var httpClient = _httpClientFactory.CreateClient("TokenService");
// Prepare the request content with client credentials
var requestContent = new List>
{
new("grant_type", _configuration.GrantType),
new("scope", _configuration.Scope),
new("client_id", _configuration.ClientId),
new("client_secret", _configuration.ClientSecret)
};
// Make the token request
var httpResponseMessage =
await httpClient.PostAsync("connect/token", new FormUrlEncodedContent(requestContent));
// Handle the token response
if (!httpResponseMessage.IsSuccessStatusCode)
throw new Exception(httpResponseMessage.StatusCode.ToString());
// Read and deserialize the token response
var responseContent = await httpResponseMessage.Content.ReadAsStringAsync();
return System.Text.Json.JsonSerializer.Deserialize(responseContent);
}
}
```
The Signicat API authorisation server validates your client credentials and returns an access token that grants your application access to the Data Verification API.
### Run the application
To run the application locally on your machine:
1. Open a terminal and go to the `src` folder.
2. Enter the `dotnet run` command.
:::note Checkpoint
Now that you have configured the credentials and run your application, verify that:
- Navigating to `http://localhost:7650` in your browser, you can view the "Signicat Data Verification Sample App." text.
:::
## Retrieve data about an organisation
When calling the [Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) of the Data Verification API, you can retrieve basic information about an organisation, such as name, address and contact.
In the API request, you need to specify:
- Organisation ID
- Country code
- Data source
:::warning Data sources
Note that specifying a data source is optional when you use the Data Verification API outside the scope of this guide. By default, the API selects the best source available in your portfolio in the Dashboard.
Learn more about data sources in the [Data sources](/docs/data-verification/data-sources/) page.
:::
### Build the API request
With the sample application running in the background, you can perform an API request using your browser.
When you navigate to a specific URL path, the application:
- Makes a call to the API
- Retrieves the data
- Displays the response as a string
You can build your URL path using the following URL structure:
```http
http://localhost:7650/organization/basic/{country}/{source}/{id}
```
**Example**
For example, you can look up information about Signicat in the Brønnøysundregistrene (business registry in Norway) using the [Basic organisation endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) in the background.
To do this, use the following values:
:::CustomTable{columnWidths="33% 33% 33%"}
| Country code | Organisation ID | Data source |
| ------------ | --------------- | ----------- |
| `no` | `989584022` | `no-brreg` |
:::
and build the URL like:
```http
http://localhost:7650/organization/basic/no/no-brreg/989584022
```
:::note Checkpoint
Now, verify that:
- Navigating to `http://localhost:7650/organization/basic/no/no-brreg/989584022` in your browser you can view the response from the API.
:::
### Advanced code analysis
In this section, you can find additional details to help you understand how the application code works.
:::details Click to expand
The application builds the URL routes with the following code:
```dotnet title="src/Program.cs"
...
var organization = app.MapGroup("/organization");
organization.MapGet("/basic/{country}/{source}/{id}", GetOrganizationBasic);
...
```
When you navigate to the organisation URL, the `GetOrganizationBasic` handler is called:
```dotnet title="src/Program.cs"
...
// Handler for getting basic organization information
static async Task GetOrganizationBasic(string country, string source, string id, DataVerificationApiService dataVerificationApiService)
{
var response = await dataVerificationApiService.GetOrganizationBasic(country, source, id);
return TypedResults.Ok(response);
}
...
```
This triggers the `DataVerificationApiService` class, which contains the `GetOrganizationBasic` method:
```dotnet title="src/DataVerificationApiService.cs"
// DataVerificationApiService class to handle API requests for person and organization information
public class DataVerificationApiService(IHttpClientFactory httpClientFactory, TokenService tokenService)
{
...
// Get basic organization information from the API
public async Task GetOrganizationBasic(string country, string source, string id)
{
return await MakeRequest($"countries/{country}/organizations/{id}?source={source}");
}
...
}
```
The method receives the values `country`, `source`, `id` from the URL route and formats them into a request to the Data Verification API [Basic organisation endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo), using the following structure:
```http
https://api.signicat.com/info/lookup/countries/{country}/organizations/{id}?source={source}
```
The complete cURL request with an access token would look like this:
```sh
curl -X GET https://api.signicat.com/info/lookup/countries/no/organizations/989584022?source=no-brreg
-H "Accept: application/json"
-H "Authorization: Bearer {token}"
```
:::
## Retrieve data about a person
To retrieve basic information about a person, you can use the Data Verification API [Persons Basic endpoint](pathname:///apis/data-verification/#tag/Persons/operation/Person_GetBasic_GET).
Using the application, you can get this information using the URL route:
```
http://localhost:7650/person/basic/{country}/{source}/{id}
```
Substitute the `{country}`, `{source}`, and `{id}` variables with actual values.
**Example**
For example, you can use synthetic data provided by Tenor test data
for the Norge Folkeregisteret (Norway National Registry):
:::CustomTable{columnWidths="33% 33% 33%"}
| Country code | Identity number | Data source |
| ------------ | --------------- | ----------- |
| `no` | `13917099981` | `no-freg` |
:::
:::note Checkpoint
Now, verify that by navigating to `http://localhost:7650/person/basic/no/no-freg/13917099981` in your browser, you can view the response from the API.
:::
## Next steps
Learn more about the Data Verification API to extend your application and integrate with more endpoints:
* [**Data Verification API**](/apis/data-verification/): Retrieve information about natural persons or organisations
* [**API overview**](/docs/data-verification/api-overview): Learn about the features of the Data Verification API
---
## Person and Organisation Look-Up Coverage for Data Verification
# Coverage for Data Verification
When performing data enrichment and verification, it is important to understand what kind of information you can retrieve from the registries and what use cases are available in a specific country.
The tables on this page show the current coverage details for organisations and natural persons. You can explore data grouped by country and data source.
## Coverage overview
The columns in the tables below show what endpoints return data by country. To learn more about the endpoints, visit the [API overview](/docs/data-verification/api-overview.mdx) documentation.
### Natural persons
### Organisations
## Data sources
Data sources are mappings to retrieve data from a specific registry or provider. You can learn more about this in the [Data sources](/docs/data-verification/data-sources/) documentation.
### Natural persons
### Organisation
---
## How it works
When you make an API call to the Data Verification API, the information you are requesting is retrieved from an official registry (data source), normalised and returned to you according to the format specified in the endpoint you used. You can specify which data source to retrieve data from by passing the name of the source as a query parameter in the request.
In this page you can find information about what data sources are available, how to add data sources to your account and how to control which data source to use in an API request.
### Adding data sources in the Dashboard
To add, configure and remove data sources in the Signicat Dashboard, navigate to **Products** > [**Data Verification**](https://dashboard.signicat.com/data-verification/list).
Here, you can view which data sources are active and which ones need additional configuration before you can start using them. You can also search which data sources are available in your account and filter by attribute or use case.
### Testing with the API
In a sandbox account, you get access to a selection of data sources that return test data. You can use these sources to test your application and retrieve test data to validate your flows.
When testing the Data Verification API, you may want to submit requests using test data for a specific endpoint, country and data source. This can help you understand how the API works and define validation rules in your application.
:::tip Production account
To use any data source in a production account, you first need to purchase the data source.
You can purchase a new data source in the [Signicat Marketplace](https://dashboard.signicat.com/store-front/marketplace). If you are an existing customer, reach out to your account manager to add new sources to your agreement.
:::
### How to specify a data source in an API request
When you make an API call to the Data Verification API, the information you are requesting is retrieved from an official registry (data source), normalised and returned to you according to the format specified in the endpoint.
By default, Signicat selects the most appropriate data source based on the product availability in your portfolio to ensure that you receive a correct response. In cases where multiple sources apply to your use case, Signicat chooses the most suitable source.
To retrieve data from a specific data source, you must specify the data source as a query parameter in your request. To learn how to specify a data source, see the [Controlling the data source](#controlling-the-data-source) section below.
#### Using the default data source
The default data source depends on the country and the attribute (endpoint) you query.
For example, when requesting basic information about an organisation based in Norway, such as Signicat, you would use the [Organisation > Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) like this:
```
GET https://api.signicat.com/info/lookup/countries/NO/organizations/989584022
```
where `NO` is the country code and `989584022` is Signicat's `organizationNumber`.
In this case, the Data Verification API retrieves the data from Brønnøysundregistrene, the registry of businesses in Norway (data source code is `no-brreg`). This is the default data source because it matches the following conditions:
- Registry for organisations
- Registry for Norway
- Registry for basic information
To view what data source was used in a response, inspect the `metadata` field in the API response:
```json {8}
{
"name": "SIGNICAT AS",
...
"organizationNumber": "989584022",
...
"metadata": {
"sources": [
"no-brreg"
],
"urls": [
"https://data.brreg.no/enhetsregisteret/api/enheter/989584022"
],
...
}
}
```
#### Controlling the data source
You can control the data source where to retrieve data from. To do so, you must specify the `source` as a query parameter in the API request.
:::warning Important conditions
Note that when specifying a data source in your request, the following must be true:
- The data source must be active in your account.
- The data source must be supported by the attribute/endpoint.
- The data source must apply to the country.
If your request does not meet any of these conditions, the request fails and you receive an error message in the response.
:::
For example, to query basic information about Signicat, as shown in the example above, you could specify a global registry such as Creditsafe in the [Organisation > Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) like this::
```
GET https://api.signicat.com/info/lookup/countries/NO/organizations/989584022?source=creditsafe
```
The response would look like this:
```json {10}
{
"name": "SIGNICAT AS",
...
"organizationNumber": "989584022",
...
...
...
"metadata": {
"sources": [
"creditsafe"
],
"urls": [
"https://connect.sandbox.creditsafe.com/v1/companies/NO-0-NO00977839?template=basic"
],
"lastChanged": "2023-11-09T02:47:49.000Z",
...
}
}
```
:::tip How data could vary across data sources
Responses from different data sources may return different data. This is because each registry provides information in a different way.
:::
Visit the [Data sources](/docs/data-verification/data-sources/) to view what data sources are supported by the Data Verification API.
---
## Data sources for Data Verification
# Data sources
Connect to a broad set of identity data sources for individuals (B2C) and businesses (B2B). Verify name, address, financial data and PEP/sanction list status plus business roles, ownership, authorisations UBOs and more.
## Natural persons
## Organisations
---
## Asiakastieto Finland
Asiakastieto is an information provider in Finland. This data source offers data on company ownership, financial aspects and credit ratings.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Finland |
| Type of data | Organisation |
| Endpoints | Ownership, Roles |
| Query parameter | `fi-asiakastieto` |
:::
---
## Bisnode Finland
Bisnode Finland provides business and credit information on Finnish companies. This data source helps assess risk and confirm company identity.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Finland |
| Type of data | Organisation |
| Endpoints | Ultimate beneficial owners, Roles, Authorization |
| Query parameter | `fi-bisnode` |
:::
---
## Bisnode Norway
Bisnode Norway provides detailed information on companies registered in Norway, including ownership, financial data and credit scores.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Norway |
| Type of data | Organisation |
| Endpoints | Ownership, Ultimate beneficial owners, Roles |
| Query parameter | `no-bisnode` |
:::
---
## Bolagsverket Sweden
The [Bolagsverket](https://www.bolagsverket.se/) is the official business register in Sweden. It is a centralised and publicly accessible register that contains information about companies, partnerships, sole proprietorships, economic associations and other legal entities operating in Sweden.
The register serves as an official record for businesses and is used by entrepreneurs, authorities and the public to verify business details, ensure transparency and facilitate business transactions.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Sweden |
| Type of data | Organisation |
| Endpoints | Basic, Ultimate beneficial owners, Roles, Authorization |
| Query parameter | `se-bolagsverket` |
:::
## Data attributes
The Data Verification API provides the following attributes from Bolagsverket:
- **Basic**
- **Ownership**
- **Ultimate Beneficial Owners (UBOs)**
- **Roles**
- **Authorisation and signatory rights**
## API requests
To make an API call to the [Organisation Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) and retrieve data from Bolagsverket, build your API request URL like:
```curl
https://api.signicat.com/info/lookup/countries/{country}/organizations/{id}?source={source}&rawJson=true
```
Note the following parameters in the request:
- `id`: The company registration number.
- `country`: One or more ISO 3166-1 alpha-2 country codes, separated by commas. For example: `se`.
- `source`: The data provider or screening source (`se-bolagsverket`).
For example, you can look up information about Signicat AB (`id`:`5567615561`) in Sweden (`country`: `se`) by sending this request:
```curl
https://api.signicat.com/info/lookup/countries/se/organizations/5567615561?source=se-bolagsverket&rawJson=true
```
:::tip Note
The list of parameters shown on this page is not exhaustive. For the full list of query parameters, see the API reference for the relevant endpoint (for example, the [Organisation Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) used in the sample request).
:::
## Test data
You can use the following organisation registration numbers (`id`) for testing the data source:
| Company registration number | Company name |
|-----------------------------|--------------|
| `5567615561` | Signicat AB |
| `5560747551` | IKEA of Sweden AB |
| `5564377355` | En Bok för Alla Aktiebolag |
| `5560117482` | AstraZeneca AB |
---
## Brønnøysundregistrene (BRREG) Norway
Brønnøysundregistrene (BRREG) is the Norwegian government agency responsible for managing public registers, including the Norwegian Business Register (Foretaksregisteret), the Register of Legal Entities and other official registries. It is a trusted source for company and organisation data in Norway, providing information on legal entities, ownership, financials and registration details.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Norway |
| Type of data | Organisation |
| Endpoints | Basic, Roles, Authorization, Finance, Search |
| Query parameter | `no-brreg` |
:::
## Data attributes
The Data Verification API provides the following attributes from BRREG:
- **Basic**
- **Ownership**
- **Roles**
- **Authorisation and signatory rights**
- **Search**
## API requests
To make an API call to the [Organisation Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) and retrieve data from BRREG, build your API request URL like:
```curl
https://api.signicat.com/info/lookup/countries/{country}/organizations/{id}?source={source}&rawJson=true
```
Note the following parameters in the request:
- `id`: The company registration number.
- `country`: One or more ISO 3166-1 alpha-2 country codes, separated by commas. For example: `se,no`.
- `source`: The data provider or screening source (`no-brreg`).
For example, you can look up information about Signicat AS (`id`:`989584022`) in Norway (`country`: `no`) by sending this request:
```curl
https://api.signicat.com/info/lookup/countries/no/organizations/989584022?source=no-brreg&rawJson=true
```
:::tip Note
The list of parameters shown on this page is not exhaustive. For the full list of query parameters, see the API reference for the relevant endpoint (for example, the [Organisation Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) used in the sample request).
:::
### Focus on a branch office
Additionally, you may request information about the branch of an organisation by specifying the `idtype=branch`, as a query parameter in the request to the API:
```curl
https://api.signicat.com/info/lookup/countries/:country/organizations/:id?source=no-brreg&rawJson=true&idtype=branch
```
## Test data
You can use the following organisation registration numbers (`id`) for testing the data source:
| Company registration number | Company name |
|-----------------------------|--------------|
| `989584022` | Signicat AS |
| `977511402` | Bybanen AS |
| `959657769` | Bama International AS |
| `910747711` | Orkla ASA |
| `889531312` | Signicat AS, AVD Stortingsg Oslo (Branch test data) |
---
## BvD (Bureau van Dijk)
BvD (Bureau van Dijk) is a global business data provider. This data source offers company structure, ownership, financial data and risk scores.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Organisation |
| Endpoints | Basic, Roles, Finance, Search |
| Query parameter | `bvd` |
:::
---
## Bureau van Dijk (via T-Rank)
Bureau van Dijk (via T-Rank) provides information about company ownership.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Organisation |
| Endpoints | Ownership, Ultimate beneficial owners |
| Query parameter | `t-rank-bvd` |
:::
---
## Companies House
Companies House is the official register of companies in the UK. This data source provides public data on company formation, directors, filings and ownership.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Great Britain |
| Type of data | Organisation |
| Endpoints | Basic, Ultimate beneficial owners, Roles, Search |
| Query parameter | `companies-house` |
:::
---
## CreditSafe
CreditSafe is a global business credit report provider. This data source offers scores and summaries to assess business risk.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Organisation |
| Endpoints | Basic, Roles, Finance, Search |
| Query parameter | `creditsafe` |
:::
---
## CVR (Det Centrale Virksomhedsregister)
The [Danish Business Authority (Erhvervsstyrelsen)](https://datacvr.virk.dk/data/?language=en-gb) manages the Danish Central Business Register (CVR), known as Det Centrale Virksomhedsregister.
CVR is the official government registry for all businesses in Denmark and Greenland and serves as the authoritative source for company data, including legal entities, ownership, financial data and registration details.
This source provides data covering all business types except personally owned companies with an annual turnover lower than 50,000 DKK.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Denmark |
| Type of data | Organisation |
| Endpoints | Basic, Ownership, Ultimate beneficial owners, Roles, Authorization |
| Query parameter | `dk-cvr` |
:::
## Data attributes
The Data Verification API provides the following attributes from CVR:
- **Basic** (e.g. company name, registration date, legal status, industry, address, organisation type)
- **Ownership** (e.g. beneficial owners, founders)
- **Ultimate Beneficial Owners (UBOs)** (e.g. ultimate beneficial owners)
- **Roles** (e.g. board members, managers, audit firms)
- **Authorisation and signatory rights** (e.g. signing combination, where available)
## API requests
To make an API call to the [Organisation Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) and retrieve data from CVR, build your API request URL like:
```curl
https://api.signicat.com/info/lookup/countries/{country}/organizations/{id}?source={source}&rawJson=true
```
Note the following parameters in the request:
- `id`: The company registration number.
- `country`: One or more ISO 3166-1 alpha-2 country codes, separated by commas. For example: `dk`.
- `source`: The data provider or screening source (`dk-cvr`).
For example, you can look up information about Novo Nordisk (`id`:`24256790`) in Denmark (`country`: `dk`) by sending this request:
```curl
https://api.signicat.com/info/lookup/countries/dk/organizations/24256790?source=dk-cvr&rawJson=true
```
:::tip Note
The list of parameters shown on this page is not exhaustive. For the full list of query parameters, see the API reference for the relevant endpoint (for example, the [Organisation Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) used in the sample request).
:::
## Test data
You can use the following organisation registration numbers (`id`) for testing the data source:
| Company registration number | Company name | Notes |
|------------|------------------------|---------------------------------|
| `36887613` | Legoland ApS | |
| `50574911` | IKEA A/S | |
| `36074906` | Creditsafe Denmark ApS | |
| `43556541` | (r)Evolution ApS | |
| `30946537` | DenFriePresse Danmark | No signers identified |
| `24256790` | Novo Nordisk | No signers identified |
---
## Data.be KBO Belgium
Data.be KBO Belgium provides Belgian company information from the official KBO register. This data source includes ownership, legal status and roles. Learn more at [https://data.be/en](https://data.be/en).
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Belgium |
| Type of data | Organisation |
| Endpoints | Basic, Roles |
| Query parameter | `be-databe` |
:::
---
## Dun & Bradstreet (formerly Bisnode)
Dun & Bradstreet (formerly Bisnode) covers company data across multiple countries. This data source is useful for international business checks and credit reports.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Denmark, Finland, Norway, Sweden |
| Type of data | Organisation |
| Endpoints | Basic, Finance |
| Query parameter | `bisnode` |
:::
---
## GLEIF
The Global Legal Entity Identifier Foundation manages the LEI system, which links legal entities with unique identifiers worldwide.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Organisation |
| Endpoints | Basic, Search |
| Query parameter | `gleif` |
:::
---
## Data sources for organisations
---
## KAR (Konto og Adresseringsregister)
KAR (Konto og Adresseringsregister) is a Norwegian registry that links businesses and bank accounts. This data source is useful for verifying payment details and preventing fraud.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Norway |
| Type of data | Organisation |
| Endpoints | Account Holder Verification |
| Query parameter | `kar` |
:::
---
## KvK API Netherlands
The Handelsregister (Trade Register) of the Netherlands provides verified company information used for KYB checks.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Netherlands |
| Type of data | Organisation |
| Endpoints | Basic, Search |
| Query parameter | `kvk` |
:::
---
## KvK HR Netherlands
The [Dutch Chamber of Commerce](https://www.kvk.nl/english/) provides current company data, including legal status and directors.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Netherlands |
| Type of data | Organisation |
| Endpoints | Basic, Ultimate beneficial owners, Roles, Authorization |
| Query parameter | `kvk-dataservice` |
:::
---
## OpenCorporates
OpenCorporates offers company data from official global public registers.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Organisation |
| Endpoints | Search |
| Query parameter | `opencorporates` |
:::
---
## OpenRegisters (Kausate)
OpenRegisters (Kausate) provides data and documents for organisations in Germany through the German Handelsregister (trade registers). This data source allows you to retrieve real-time current and chronological entity information, shareholder lists, articles of association and structured information on a company.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|-----------------------------------|
| Geographical coverage | Germany |
| Type of data | Organisation |
| Endpoints | Search, Basic, Roles, Documents |
| Query parameter | `open-registers` |
:::
## Data attributes
The Data Verification API provides the following attributes from OpenRegisters (Kausate):
- **Search**
- **Basic**
- **Roles**
- **Documents**
The following documents are supported for retrieval:
- Basic current entity information (*Aktuelle Daten*): `basic`
- Shareholder lists (*Gesellschafterlisten*): `shareholder`
- Articles of Association (*Gesellschaftsvertrag/Satzung*): `registration`
- Chronological Register Information (*Chronologische Übersicht*): `historical`
- Structured Information (*Strukturierte Informationen*): `registerextract`
## API requests
The following endpoints are supported through the OpenRegisters (Kausate) integration:
:::CustomTable{columnWidths="25% 40% 35%"}
| Endpoint | Input parameters | Notes |
|-----------|----------------------------------------------------------------|-------------------------------|
| Search | `country ( DE )``name``source` | |
| Basic | `country ( DE )``Org Number`/`id``source` | Retrieve the company's `externalId` from the `Search` endpoint and provide it as the `id` when calling this endpoint. |
| Roles | `country ( DE )``Org Number`/`id``source` | Retrieve the company's `externalId` from the `Search` endpoint and provide it as the `id` when calling this endpoint. |
| Documents | `country ( DE )``documentType``id``name``source` | `name` or `id` can be used with this endpoint.Retrieve the company's `externalId` from the `Search` endpoint and provide it as the `id` when calling this endpoint.If no document type is set in the request, the `basic` document type is returned by default. |
:::
:::tip Note
Because documents are retrieved in real time, requests may occasionally take longer to complete. In such cases, the `orderId` is cached and the document will be available for download on the next attempt.
:::
The following is a sample API request to the [Organisation Documents endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Documents_GET):
```curl
https://api.signicat.com/info/lookup/organizations/documents?country=DE&documentType=basic&name=volvo &source=open-registers&rawJSON=true
```
:::tip Note
The list of parameters shown on this page is not exhaustive. For the full list of query parameters, see the API reference for the relevant endpoint (for example, the [Organisation Documents endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Documents_GET) used in the sample request).
:::
---
## PRH Finland
The Finnish Patent and Registration Office (PRH) and the Finnish Tax Administration are jointly the registrars of the Business and Corporate Information System (YTJ).
The types of business registered in PRH can be found at [https://www.prh.fi/en/companiesandorganisations/tilastot/lkm.html](https://www.prh.fi/en/companiesandorganisations/tilastot/lkm.html).
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Finland |
| Type of data | Organisation |
| Endpoints | Basic, Search |
| Query parameter | `fi-prh` |
:::
## Data attributes
The Data Verification API provides the following attributes from PRH:
- **Basic**
- **Search**
## API requests
To make an API call to the [Organisation Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) and retrieve data from PRH, build your API request URL like:
```curl
https://api.signicat.com/info/lookup/countries/{country}/organizations/{id}?source={source}&rawJson=true
```
Note the following parameters in the request:
- `id`: The company registration number.
- `country`: One or more ISO 3166-1 alpha-2 country codes, separated by commas. For example: `fi`.
- `source`: The data provider or screening source (`fi-prh`).
For example, you can look up information about Nokia Networks Oy (`id`:`0101120-3`) in Finland (`country`: `fi`) by sending this request:
```curl
https://api.signicat.com/info/lookup/countries/fi/organizations/0101120-3?source=fi-prh&rawJson=true
```
:::tip Note
The list of parameters shown on this page is not exhaustive. For the full list of query parameters, see the API reference for the relevant endpoint (for example, the [Organisation Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) used in the sample request).
:::
## Test data
You can use the following organisation registration numbers (`id`) for testing the data source:
| Company registration number | Company name |
|-----------------------------|--------------|
| `0101120-3` | Nokia Networks Oy |
| `0103543-2` | Oy Erik Selin Ab |
| `0112308-8` | Handelsbanken Finans Abp |
| `0109043-1` | Nordea Kiinteistöomistus Oy |
---
## SurePay
SurePay verifies if a business name matches a bank account (IBAN). This helps prevent payment fraud by checking account ownership.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | France, Great Britain, Italy, Netherlands |
| Type of data | Organisation |
| Endpoints | Account Holder Verification |
| Query parameter | `surepay` |
:::
---
## TietoEvry (via T-rank)
TietoEvry (via T-rank) provides business data, offering insights into company ownership across the Nordics.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Denmark, Finland, Norway, Sweden |
| Type of data | Organisation |
| Endpoints | Ownership, Ultimate beneficial owners |
| Query parameter | `t-rank-evry` |
:::
---
## Trapets
[Trapets](https://www.trapets.com/about-us) helps in meeting compliance requirements, reducing risk and supporting customer onboarding, ongoing due diligence (ODD) and enhanced due diligence (EDD) processes.
This data provider features screening for organisations against the PEP, sanction and adverse media lists.
Trapets is suitable for both one-time and continuous screening of organisations.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Organisation |
| Endpoints | Screening |
| Query parameter | `trapets` |
:::
## Data attributes
The Data Verification API provides the following attributes from Trapets:
- **Screening**
## API requests
To make an API call to the [Organisation Screening endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Screening_GET) and retrieve data from Trapets, build your API request URL like:
```curl
https://api.signicat.com/info/lookup/countries/{countries}/organizations/screening?name={name}&listType={listType}&source={source}
```
Note the following parameters in the request:
- `country`: One or more ISO 3166-1 alpha-2 country codes, separated by commas. For example: `se,no`.
- `source`: The data provider or screening source (`trapets`).
- `name`: The name of the organisation to screen.
- `listType`: One or more list categories to check against. Supported values: `pep`, `sanction`, `adverseMedia`. Use commas to separate multiple values.
For example, you can screen Extra Företag AB for sanctions by sending this request:
```curl
https://api.signicat.com/info/lookup/organizations/screening?name=Extra%20F%C3%B6retag%20AB&listType=sanction&source=trapets
```
:::tip Note
The list of parameters shown on this page is not exhaustive. For the full list of query parameters, see the API reference for the [Organisation Screening endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Screening_GET).
:::
## Matching logic
Trapets uses two types of name-matching logic when screening:
- **Exact match** (also called Regular)
- **Phonetic match** (also called Fuzzy)
### Exact match
In an exact match, all name parts in the searched name must be equal to name parts in a single list entry. The order of name parts does not matter.
:::note Definition
"Equal" means character-by-character identical.
:::
If a name part appears more than once in the searched name, then it must also appear the same number of times in the list entry.
**Examples**
- `John John Andersson` *matches* `John John Andersson`
- `John Andersson` *matches* `John John Andersson`
- `John John Andersson` (search) *does not match* `John Andersson` (list entry)
### Phonetic match
Phonetic matching uses fuzzy logic to find names that sound (phonetically) similar, based on the **Metaphone3** algorithm.
The system looks for at least one name part in the searched name that phonetically matches a name part in a list entry. Then, it calculates similarity using the **Levenshtein distance** algorithm, which measures how many edits are needed to change one word into another.
Each name part's distance is weighted by its length. This means that differences in longer name parts affect the total score more than shorter ones.
:::tip Recommended threshold
A similarity score (hit rate) between **0.75** and **0.9** is typically recommended for fuzzy matching.
:::
### Score
The **score** represents the confidence level of a match, based on Trapets' internal **Hit Rating** system.
:::info How it works
- The **Hit Rating** is an integer from 1 to 5.
- The **score** is calculated by multiplying the **Hit Rating** by 20 to produce a percentage. For example, 5 x 20 = 100%.
:::
#### Examples
- A **Hit Rating** of 5 (score 100) means a perfect match, typically when a unique identifier, such as social security number (SSN) or company registration number, is used.
- If no SSN is provided and the match is based only on name and country, the **Hit Rating** may be lower (1 or 2) and the total score affected (20% or 40%).
### Hit rating
Indicates how relevant this list item is to the query. The higher number, the more accurate the match, with 5 being the most accurate.
#### Hit rating breakdown
**Natural persons**
:::CustomTable{tableName="Persons" columnWidths="50% 50%"}
| Input | Hit Rating |
|------------------------|------------|
| SSN | 5 |
| Name + Date of birth\* | 4 |
| Name + Country | 2 |
| Name only | 1 |
:::
\* Date of birth can be provided as full date, `YYYY-MM` or just `YYYY`.
**Organisations**
:::CustomTable{tableName="Organisations" columnWidths="50% 50%"}
| Input | Hit Rating |
|------------------------|------------|
| Company registration number | 5 |
| Name + Country | 2 |
| Name only | 1 |
:::
## Screening Logic
The KYC screening engine processes input parameters in order of reliability. The flow differs slightly between PEP and sanctions screening.
### PEP screening
When screening for politically exposed persons (PEPs), the engine evaluates the input fields in the following order:
1. **Social Security Number (SSN)**
- If an SSN is provided and matched, it is considered a definitive match. All other input (name, country, date of birth) is ignored.
- If no match is found, the engine excludes list entries with non-matching SSNs.
2. **Date of birth**
- If provided, the engine keeps only entries with matching dates of birth or no dates of birth at all.
3. **Country**
- If provided, the engine filters out entries from non-matching countries.
4. **Name**
- Finally, the engine performs name matching based on either exact or phonetic logic.
### Sanction screening
Sanctions screening follows the same process, with one key difference:
- **SSNs** are not used, as sanctions lists do not include SSNs.
## Test data
:::CustomTable{tableName="Trapets test data"}
| List Type | Name | Country | Birth | SSN | List |
|----------------|----------------|-----------|---------|--------|----------|
| PEP | Sebastian Bengtsson | Sweden | 1980-05-06 | SE198005067031 | PEP_Edge |
| PEP | Hamid Forsberg | Sweden | 1965-03-07 | SE196503070895 | PEP_Edge |
| PEP | Johan Svensson | Sweden | 1959-03-08 | SE195903082575 | PEP_Edge |
| PEP | Katrine Thorstensen | Norway | 1973-11-11 | NO11117319646 | PEP_Edge |
| PEP | James Roslund | Sweden | 1957-01-13 | SE195701136771 | PEP_Edge |
| PEP (Relative or Close Associate)| Viola Roslund | Sweden | 1956-05-05 | SE195605050342 | PEP_Edge |
| PEP (Relative or Close Associate)| Sofia Rosander | Sweden | 1976-09-13 | SE197609138164 | PEP_Edge |
| PEP | John Bradshaw | Great Britain | 1978-10-10 | | ACURIS_PEP |
| PEP | Alicia Wade | Great Britain | 1943-01-16 | | ACURIS_PEP |
| PEP | Sana Dijkhuizen | Netherlands | 1953 | | ACURIS_PEP |
| PEP | Dieter Sommer | Germany | 1936-11-18 | | ACURIS_PEP |
| PEP/Sanction | Ritva Katariina Rankkala | Finland | | 061282-178E | PEP_Edge/EU_Global |
| PEP/Sanction | Birgitta Birgersson | Finland | | 070874-178T | PEP_Edge/EU_Global |
| PEP/Sanction | Risto Reippaala | Finland | | 080496-728M | PEP_Edge/EU_Global |
| PEP/Sanction | Tomí Tiikeri | Finland | | 121260-123V | PEP_Edge/EU_Global |
| PEP/Sanction | Nille Psa Augestad | Norway | 1982-01-18 | NO18018200283 | PEP_Edge/EU_Global |
| PEP/Sanction | Lasse-Steffen Goldheim | Norway | 1977-01-18 | NO18017749532 | PEP_Edge/EU_Global/ OFAC |
| Sanction | Assar Lovén | Sweden | 1999-01-27 | | EU_Global |
| Sanction | Yharnam Hunters OY | Finland | | 3744105-3 | EU_Global, UN_Consolidated |
| Sanction | Boletaria | Finland | | 7058505-9 | EU_Global, UN_Consolidated |
| Sanction | Lordran Knights | Finland | | 3505875-5 | EU_Global, UN_Consolidated |
| Sanction | Tone Olsen | Norway | 1999-09-02 | | OFAC |
| Sanction | Henry Montgomery | USA | 1977-07-09 | | OFAC_CS |
| Sanction | The Great Bank of Cebala | Tunisia | | | OFAC_CS |
:::
---
## Aristotle
Aristotle provides global identity verification. It checks names, addresses and other details using official records from many countries.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Natural persons |
| Endpoints | Identity Verification |
| Query parameter | `aristotle` |
:::
---
## CPR Denmark
CPR (Det Centrale Personregister; Civil Registration System of Denmark) provides personal details of people living in Denmark, including names, addresses and ID numbers.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Denmark |
| Type of data | Natural persons |
| Endpoints | Address, Basic |
| Query parameter | `dk-cpr` |
:::
---
## Dun & Bradstreet (Consumer Intelligence)
Dun & Bradstreet (Consumer Intelligence) provides consumer data with support for searching by phone number, first name, last name and date of birth. This source provides updated Nordic customer data that can help to enrich business systems.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Denmark, Finland, Norway, Sweden |
| Type of data | Natural persons |
| Endpoints | Identity Verification |
| Query parameter | `dnb-ci` |
:::
---
## Dun & Bradstreet (formerly Bisnode)(Persons)
Dun & Bradstreet (formerly Bisnode) provides financial information in Europe. This data source allows for verification of an individual's identity and creditworthiness.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Denmark, Finland, Norway, Sweden |
| Type of data | Natural persons |
| Endpoints | Finance, Basic |
| Query parameter | `bisnode` |
:::
---
## DVV Finland
The Digital and Population Data Services Agency of Finland provides official data about persons and their addresses in Finland.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Finland |
| Type of data | Natural persons |
| Endpoints | Address, Basic |
| Query parameter | `fi-dvv` |
:::
---
## Experian Infoscore (formerly Arvato)
Experian Infoscore (formerly Arvato) provides natural person address verification data in Austria and Germany.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Austria, Germany |
| Type of data | Natural persons |
| Endpoints | Identity Verification |
| Query parameter | `arvato` |
:::
---
## Folkeregisteret Norway
Norway's National Population Register provides official personal details like names, birth dates and addresses.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Norway |
| Type of data | Natural persons |
| Endpoints | Address, Basic, Search |
| Query parameter | `no-freg` |
:::
---
## Data sources for natural persons
---
## Infotorg DSF
Infotorg DSF provides personal and address information from a Norwegian database. This data source allows for verification of residency and identity details.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Norway |
| Type of data | Natural persons |
| Endpoints | Address, Basic |
| Query parameter | `no-infotorg-dsf` |
:::
---
## KAR (Konto og Adresseringsregister)(Persons)
KAR is Norway's account and address register. It provides cross-referenced results about a person's bank accounts and their contact details for secure payments.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Norway |
| Type of data | Natural persons |
| Endpoints | Account Holder Verification |
| Query parameter | `kar` |
:::
---
## KRR (Kontakt- og reservasjonsregisteret)
KRR (Kontakt- og reservasjonsregisteret) is the national contact register in Norway. It provides contact information such as email addresses and phone numbers for persons.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Norway |
| Type of data | Natural persons |
| Endpoints | Contact |
| Query parameter | `krr` |
:::
---
## LSEG (formerly GDC (Global Data Consortium)
LSEG (formerly GDC (Global Data Consortium)) comprises a worldwide network of local data sources. It helps verify identities of natural persons using trusted records from each country.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Natural persons |
| Endpoints | Identity Verification |
| Query parameter | `gdc` |
:::
---
## Schufa
Schufa provides information about a person's credit history and identity.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Natural persons |
| Endpoints | Identity Verification |
| Query parameter | `schufa` |
:::
---
## SPAR (Statens Personadressregister)
SPAR (Statens Personadressregister) is the national address register in Sweden. This data source provides names, ID numbers and current addresses of natural persons.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Sweden |
| Type of data | Natural persons |
| Endpoints | Address, Basic |
| Query parameter | `se-spar` |
:::
---
## SurePay(Persons)
[SurePay](https://surepay.nl/en/) is a lookup service for France, Great Britain, Italy and The Netherlands. This data source allows for identity proofing and checks to establish if a bank account (IBAN) belongs to a specific person.
This service can be useful in several scenarios. For example, if a company needs to make regular payments to a bank account, they may want to verify the account during onboarding. Integrating with SurePay helps you prevent fraud and mistakes, while improving the user experience.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | France, Great Britain, Italy, Netherlands |
| Type of data | Natural persons |
| Endpoints | Account Holder Verification |
| Query parameter | `surepay` |
:::
---
## Trapets(Persons)
[Trapets](https://www.trapets.com/about-us) helps in meeting compliance requirements, reducing risk and supporting customer onboarding, ongoing due diligence (ODD) and enhanced due diligence (EDD) processes.
This data provider features screening for persons against PEP, sanction and adverse media lists.
Trapets is suitable for both one-time and continuous screening of natural persons.
## Properties
:::CustomTable{tableName="Data source specs" columnWidths="50% 50%"}
| Property | Value |
|-----------------------|--------|
| Geographical coverage | Global |
| Type of data | Natural persons |
| Endpoints | Screening |
| Query parameter | `trapets` |
:::
## Data attributes
The Data Verification API provides the following attributes from Trapets:
- **Screening**
## API requests
To make an API call to the [Persons Screening endpoint](pathname:///apis/data-verification/#tag/Persons/operation/PersonGlobal_Screening_GET) and retrieve data from Trapets, build your API request URL like:
```curl
https://api.signicat.com/info/lookup/countries/{countries}/persons/screening?name={name}&listType={listType}&source={source}
```
Note the following parameters in the request:
- `country`: One or more ISO 3166-1 alpha-2 country codes, separated by commas. For example: `se,no`.
- `source`: The data provider or screening source (`trapets`).
- `name`: The name of the person to screen.
- `listType`: One or more list categories to check against. Supported values: `pep`, `sanction`, `adverseMedia`. Use commas to separate multiple values.
For example, you can screen Katrine Thorstensen for PEP, sanctions and adverse media in Sweden by sending this request:
```curl
https://api.signicat.com/info/lookup/persons/screening?countries=se%2Cno&name=Katrine%20Thorstensen&source=trapets&listType=pep%2Csanction%2CadverseMedia&rawJson=true
```
:::tip Note
The list of parameters shown on this page is not exhaustive. For the full list of query parameters, see the API reference for the [Persons Screening endpoint](pathname:///apis/data-verification/#tag/Persons/operation/PersonGlobal_Screening_GET).
:::
## Matching logic
Trapets uses two types of name-matching logic when screening:
- **Exact match** (also called Regular)
- **Phonetic match** (also called Fuzzy)
### Exact match
In an exact match, all name parts in the searched name must be equal to name parts in a single list entry. The order of name parts does not matter.
:::note Definition
"Equal" means character-by-character identical.
:::
If a name part appears more than once in the searched name, then it must also appear the same number of times in the list entry.
**Examples**
- `John John Andersson` *matches* `John John Andersson`
- `John Andersson` *matches* `John John Andersson`
- `John John Andersson` (search) *does not match* `John Andersson` (list entry)
### Phonetic match
Phonetic matching uses fuzzy logic to find names that sound (phonetically) similar, based on the **Metaphone3** algorithm.
The system looks for at least one name part in the searched name that phonetically matches a name part in a list entry. Then, it calculates similarity using the **Levenshtein distance** algorithm, which measures how many edits are needed to change one word into another.
Each name part's distance is weighted by its length. This means that differences in longer name parts affect the total score more than shorter ones.
:::tip Recommended threshold
A similarity score (hit rate) between **0.75** and **0.9** is typically recommended for fuzzy matching.
:::
### Score
The **score** represents the confidence level of a match, based on Trapets' internal **Hit Rating** system.
:::info How it works
- The **Hit Rating** is an integer from 1 to 5.
- The **score** is calculated by multiplying the **Hit Rating** by 20 to produce a percentage. For example, 5 x 20 = 100%.
:::
#### Examples
- A **Hit Rating** of 5 (score 100) means a perfect match, typically when a unique identifier, such as social security number (SSN) or company registration number, is used.
- If no SSN is provided and the match is based only on name and country, the **Hit Rating** may be lower (1 or 2) and the total score affected (20% or 40%).
### Hit rating
Indicates how relevant this list item is to the query. The higher number, the more accurate the match, with 5 being the most accurate.
#### Hit rating breakdown
**Natural persons**
:::CustomTable{tableName="Persons" columnWidths="50% 50%"}
| Input | Hit Rating |
|------------------------|------------|
| SSN | 5 |
| Name + Date of birth\* | 4 |
| Name + Country | 2 |
| Name only | 1 |
:::
\* Date of birth can be provided as full date, `YYYY-MM` or just `YYYY`.
**Organisations**
:::CustomTable{tableName="Organisations" columnWidths="50% 50%"}
| Input | Hit Rating |
|------------------------|------------|
| Company registration number | 5 |
| Name + Country | 2 |
| Name only | 1 |
:::
## Screening Logic
The KYC screening engine processes input parameters in order of reliability. The flow differs slightly between PEP and sanctions screening.
### PEP screening
When screening for politically exposed persons (PEPs), the engine evaluates the input fields in the following order:
1. **Social Security Number (SSN)**
- If an SSN is provided and matched, it is considered a definitive match. All other input (name, country, date of birth) is ignored.
- If no match is found, the engine excludes list entries with non-matching SSNs.
2. **Date of birth**
- If provided, the engine keeps only entries with matching dates of birth or no dates of birth at all.
3. **Country**
- If provided, the engine filters out entries from non-matching countries.
4. **Name**
- Finally, the engine performs name matching based on either exact or phonetic logic.
### Sanction screening
Sanctions screening follows the same process, with one key difference:
- **SSNs** are not used, as sanctions lists do not include SSNs.
## Test data
:::CustomTable{tableName="Trapets test data"}
| List Type | Name | Country | Birth | SSN | List |
|----------------|----------------|-----------|---------|--------|----------|
| PEP | Sebastian Bengtsson | Sweden | 1980-05-06 | SE198005067031 | PEP_Edge |
| PEP | Hamid Forsberg | Sweden | 1965-03-07 | SE196503070895 | PEP_Edge |
| PEP | Johan Svensson | Sweden | 1959-03-08 | SE195903082575 | PEP_Edge |
| PEP | Katrine Thorstensen | Norway | 1973-11-11 | NO11117319646 | PEP_Edge |
| PEP | James Roslund | Sweden | 1957-01-13 | SE195701136771 | PEP_Edge |
| PEP (Relative or Close Associate)| Viola Roslund | Sweden | 1956-05-05 | SE195605050342 | PEP_Edge |
| PEP (Relative or Close Associate)| Sofia Rosander | Sweden | 1976-09-13 | SE197609138164 | PEP_Edge |
| PEP | John Bradshaw | Great Britain | 1978-10-10 | | ACURIS_PEP |
| PEP | Alicia Wade | Great Britain | 1943-01-16 | | ACURIS_PEP |
| PEP | Sana Dijkhuizen | Netherlands | 1953 | | ACURIS_PEP |
| PEP | Dieter Sommer | Germany | 1936-11-18 | | ACURIS_PEP |
| PEP/Sanction | Ritva Katariina Rankkala | Finland | | 061282-178E | PEP_Edge/EU_Global |
| PEP/Sanction | Birgitta Birgersson | Finland | | 070874-178T | PEP_Edge/EU_Global |
| PEP/Sanction | Risto Reippaala | Finland | | 080496-728M | PEP_Edge/EU_Global |
| PEP/Sanction | Tomí Tiikeri | Finland | | 121260-123V | PEP_Edge/EU_Global |
| PEP/Sanction | Nille Psa Augestad | Norway | 1982-01-18 | NO18018200283 | PEP_Edge/EU_Global |
| PEP/Sanction | Lasse-Steffen Goldheim | Norway | 1977-01-18 | NO18017749532 | PEP_Edge/EU_Global/ OFAC |
| Sanction | Assar Lovén | Sweden | 1999-01-27 | | EU_Global |
| Sanction | Yharnam Hunters OY | Finland | | 3744105-3 | EU_Global, UN_Consolidated |
| Sanction | Boletaria | Finland | | 7058505-9 | EU_Global, UN_Consolidated |
| Sanction | Lordran Knights | Finland | | 3505875-5 | EU_Global, UN_Consolidated |
| Sanction | Tone Olsen | Norway | 1999-09-02 | | OFAC |
| Sanction | Henry Montgomery | USA | 1977-07-09 | | OFAC_CS |
| Sanction | The Great Bank of Cebala | Tunisia | | | OFAC_CS |
:::
---
## Data Verification demo
# Try the demo
Explore the full potential of Data Verification in just a few clicks!
You can try out the Data Verification in the [demo page](https://signicat.gitlab.io/info/demo-signicat-person-info/#/), an interface designed to simulate:
- API endpoints
- Use cases
This page contains information to set up and use the Data Verification API demo.
## Connect to the Data Verification API
Before you can start making requests to this API, you need to learn how to connect to it. To do this, follow steps 1-3 in the **Connect to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::note What permissions are required?
Ensure that you set the following permissions for your API client:
- **Data Verification for natural persons** to connect to data sources about natural persons.
- **Data Verification for organisations** to connect to data sources about organisations.
:::
## Get started with the demo
To use the demo environment, you need to:
1. On the [demo](https://signicat.gitlab.io/info/demo-signicat-person-info/#/) page, enter your API client credentials. To find your API clients, see the [**API clients**](https://dashboard.signicat.com/api-clients/) page in the Dashboard.
2. Select **Get Token** to authenticate to the Data Verification API.
You have now started an authenticated session. Renew your credentials when the session expires.
:::tip Ready to go
Go ahead and [try out an endpoint](#try-out-an-endpoint) below.
:::
## Try out an endpoint
To make your first API request in the demo page:
1. Select **Endpoints** in the top navigation bar. You will view the Organizations, Persons and Sources attributes in the lower half of the page.
2. Select **Organizations** to reveal the available endpoints.
3. Select **Basic** to test the Data Verification API [Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo).
4. Enter organisation test data. For example, to retrieve information about Signicat, use:
- Country: `NO`
- ID: `989584022`
5. Select **Request** to make the API call and retrieve data about the organisation.
Congratulations! You have just made the first request to the Data Verification API. You will now view the response data in a table. You can explore any of the other endpoints available on the demo page.
## Try out a use case
The demo page is designed to allow you to explore common use cases by combining multiple features of Data Verification.
For example, you can simulate a typical organisation onboarding. To do this in the demo page:
1. Select **Use cases** in the top navigation bar. You will find a selection of use cases in the lower half of the page.
2. Select **Organization Onboarding**.
3. Enter organisation test data. For example, to retrieve information about Signicat, use:
- Country: `NO`
- ID: `989584022`
- Source: optional.
4. Select **Onboard**. In this scenario, we retrieve data from the Basic, Finance and Screening endpoints and organise the results in a table. You can download the result as a PDF.
Congratulations! You have just explored one of many scenarios where you can use Data Verification.
:::tip Data sources
If you want to know more about the data sources supported by the Data Verification API, select the "Search Sources" use case in the demo.
To learn more about each data source, go to the [Data sources](/docs/data-verification/data-sources/) documentation.
:::
## Next steps
Ready to get started and dive deeper into a code integration? Check out our guides to use the Data Verification API.
* [**Quick start guide**](/docs/data-verification/quick-start): Get started with Data Verification
* [**Code examples**](/docs/data-verification/code-examples): Dive deep into code examples
---
## Error codes for Data Verification
# Error codes
When you make a request to the Signicat's Data Verification API and there is an error, you will receive a response with an error message that contains an error code.
If you encounter an error and require assistance, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
The table below shows how to interpret some of the error codes that you might encounter when using the API.
:::tip Error object and generic error codes
In addition to these product-specific error codes, there are generic error codes which are applicable to all Signicat APIs. To learn about these and how the error object looks, see our generic [Error codes](/docs/dashboard/error-codes.mdx) documentation.
:::
:::CustomTable{columnWidths="25% 75%"}
| Error code | Description |
|:-------------- |:------------- |
| 0001 | Unauthorised. |
| 0002 | Forbidden. |
| 1100 | Requested a country that is not implemented. |
| 1101 | Requested one or more sources that are currently unavailable. |
| 1102 | Request targeted a resource where the requested dataset is not implemented. |
| 1103 | Request targeted a resource where the profile is not implemented. |
| 1104 | Requested a country that is not implemented by the provided data source. |
| 1105 | Requested a profile that is not implemented by the provided data source. |
| 1200 | The request targeted a country that does not exist. |
| 1201 | Request targeted strict data sources without specifying anyone. |
| 1202 | Request targeted one or more data sources that do not exist. |
| 1203 | Request targeted a country that is not available. |
| 1204 | Invalid request property combination. |
| 1205 | Invalid expansion property. |
| 1206 | Invalid query. |
| 1207 | Invalid date of birth. |
| 1208 | Bad request. |
| 1209 | Unprocessable entity. |
| 1210 | Invalid paging parameters. |
| 1220 | Exceeded max iterations while searching for NACE section code, data source is corrupted. |
| 1250 | Country not found. |
| 1251 | Subdivisions not found. |
| 1252 | Countries not found. |
| 1300 | Internal communication error. |
| 1301 | The source failed to respond within reasonable time. |
| 1302 | Internal communication error. |
| 1303 | Invalid argument. |
| 1304 | Internal communication error. |
| 1305 | The requested resource could not be found. |
| 1306 | Internal communication error. |
| 1307 | Internal communication error. |
| 1308 | Source is temporarily exhausted. |
| 1309 | Internal communication error. |
| 1310 | Internal communication error. |
| 1311 | Internal communication error. |
| 1312 | Internal communication error. |
| 1313 | Internal communication error. |
| 1314 | Source is temporarily unavailable. |
| 1315 | Internal communication error. |
| 1316 | Internal communication error. |
| 1500 | Something went wrong. Please contact us for assistance if the problem persists. |
| 1601 | Multiple internal communication errors. |
| 1700 | Could not find the specified cursor. |
| 1701 | Invalid cursor. |
:::
---
## Data Verification
Signicat's Data Verification is an identity verification product that allows you to check and verify customer data against national and commercial data sources, for both natural persons and organisations.
With the Data Verification API, you can retrieve information about a customer or perform a one-time verification of their data. For example, you can confirm the address and business name of companies, or screen natural persons for politically exposed person (PEP) status.
Data Verification helps you comply with Anti Money Laundering (AML) laws by connecting you to trusted data sources through a single point of integration, thus reducing the costs and challenges of integrating with several sources separately.
## Get started
* [**Try the demo**](/docs/data-verification/demo): Data Verification in a few clicks
* [**Quick start guide**](/docs/data-verification/quick-start): Get started with Data Verification
* [**Code examples**](/docs/data-verification/code-examples): Dive deep into code examples
## Use cases
Here are some use case examples to better understand how you can use Data Verification for both persons and organisations:
- Gather basic identity information for onboarding.
- View finance and credit risk rating information.
- Identify the ultimate beneficiary owner (UBO) of an organisation.
- Retrieve roles and ownership information of an organisation.
- Screen a person or an organisation for politically exposed person (PEP), sanction and adverse media status.
- Verify the ownership of bank accounts.
- Get the signatory rights of an organisation.
- Verify identity information provided by the user.
- Enrich end-user and organisation data.
- Ensure AML/KYC compliance.
### Customer cases
You can read about how our customers are using our solutions in the customer cases:
* [**Identity fraud**](https://www.signicat.com/customers/surepay): Our customer SurePay has reduced bank and identity fraud
* [**Automating AML**](https://www.signicat.com/customers/usbl): Our customer Usbl has automated AML screening of new board members
* [**Wealth management**](https://www.signicat.com/customers/zevoy): Our customer Zevoy has improved AML/KYC checks for expense management
## API
The Data Verification API returns normalised data from carefully-selected sources, making it easy for you to interpret and use the responses regardless of the data source.
* [**Data Verification API**](/apis/data-verification/): Retrieve information about natural persons or organisations
* [**API overview**](/docs/data-verification/api-overview): Learn about the features of the Data Verification API
* [**Data sources**](/docs/data-verification/data-sources): Understand the data sources
## Additional resources
* [**Use cases**](/docs/data-verification/#use-cases): Find answers to your business needs
* [**Coverage overview**](/docs/data-verification/coverage): Explore the product offerings across markets
## Support
* [**Release notes**](/docs/data-verification/release-notes): View the release notes for Data Verification
* [**Error codes**](/docs/data-verification/error-codes): View the error codes for Data Verification
If you have questions, you can contact us by creating a support ticket in the Signicat Dashboard:
[**Create support ticket**](https://dashboard.signicat.com/contact-us/tickets/new)
---
## Quick start guide to Data Verification
# Quick start guide
Learn how to verify information about natural persons or organisations using the Data Verification API.
This quick start guide shows you how to:
1. Connect to the Data Verification API.
2. Send requests to the API endpoints using Postman.
## Connect to the Data Verification API
Before you can start making requests to this API, you need to learn how to connect to it. To do this, follow steps 1-3 in the **Connect to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::note What permissions are required?
Ensure that you set the following permissions for your API client:
- **Data Verification for natural persons** to connect to data sources about natural persons.
- **Data Verification for organisations** to connect to data sources about organisations.
:::
## Get started with Postman
This guide provides steps for using [Postman](https://www.postman.com/downloads) to make API calls.
We have created a Postman collection that lets you try the Data Verification API. Click the button below to get the collection for Postman.
[](https://app.getpostman.com/run-collection/20756027-49d27748-2c66-45a9-928a-579b5c4f3084?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D20756027-49d27748-2c66-45a9-928a-579b5c4f3084%26entityType%3Dcollection%26workspaceId%3D3ea7a3cf-7777-4f42-b4e9-88876cfe660d)
For more detailed instructions on how to use the collection, refer to the instructions below.
### Import the collection to Postman
1. Download the [Postman collection](https://elements.getpostman.com/redirect?entityId=20756027-49d27748-2c66-45a9-928a-579b5c4f3084&entityType=collection).
2. Open Postman.
3. Click **File** > **Import** and browse to the collection file to import it.
4. Click the name of the collection and edit the following variables:
:::CustomTable{columnWidths="25% 50% 25%" minTableSize="900px"}
| Variable | Value | Description |
| ----------------------- | -------------------------------------------------- | ----------------------------------------------------------- |
| **oauth_url** | `https://api.signicat.com/auth/open/connect/token` | The URL where to authenticate with Signicat APIs. |
| **oauth_scope** | `signicat-api` | The API client scope you want to work with. |
| **oauth_client_id** | Your Client ID | The Client ID obtained when you created the API Client. |
| **oauth_client_secret** | Your Client secret | The Client secret obtained when you created the API Client. |
| **baseURL** | `https://api.signicat.com/info/lookup` | The base URL for the Data Verification API. |
:::
5. Click **Save**.
### Get information
You can now retrieve information about a natural person or an organisation. The [API reference](/apis/data-verification/) contains information about each of the available endpoints. For example, to query basic information about an organisation, use the [Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo) like this:
1. Go to the Basic endpoint in the Postman collection.
2. Fill in the path parameters. For example, if you want to retrieve information about Signicat, write `NO` in the **country** row and `989584022` in the **organizationNumber** row.
3. Optional. Fill in the query parameters to extend functionality. For example, you can set `rawJson` to `true` if you want to see the raw JSON output of the response.
4. Click **Send**.
For example, the request might look like this:
```curl
GET https://api.signicat.com/info/lookup/countries/NO/organizations/989584022
```
You will receive a response with the data you requested. For example:
```json
{
"name": "SIGNICAT AS",
"names": [
{
"name": "SIGNICAT AS",
"type": "registered",
"start": null,
"end": null
}
],
"organizationNumber": "989584022",
"country": {
"alpha2": "NO",
"alpha3": "NOR",
"numeric": "578"
},
"businessAddress": null,
"addresses": null,
"organizationType": {
"name": "Aksjeselskap",
"code": "AS",
"url": "https://data.brreg.no/enhetsregisteret/api/organisasjonsformer"
},
"legalStatus": "active",
"employees": 132,
"industries": [
{
"code": "58.29",
"description": "Other software publishing",
"section": "J",
"level": 4
}
],
"contact": null,
"metadata": {
"sources": ["no-brreg"],
"urls": ["https://data.brreg.no/enhetsregisteret/api/enheter/989584022"],
"lastChanged": null,
"rawJson": null
}
}
```
Note that some data is omitted for brevity. You can find a more elaborate example in the [API reference](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo).
## Data sources
If you want to know more about the data sources supported by the Data Verification API, you can get a list by using the [Sources endpoints](pathname:///apis/data-verification/#tag/Sources).
To view all the sources available for the organisation endpoints, use the Sources endpoint in the Organizations folder of the Postman collection.
```
GET https://api.signicat.com/info/lookup/sources/organization
```
To view all the sources available for natural persons, use the Sources endpoint in the Persons folder.
```
GET https://api.signicat.com/info/lookup/sources/person
```
The response will contain an updated list of the data sources used in the Data Verification API.
:::tip Data sources table
Visit the Coverage overview page to view all the data sources supported by the Data Verification API.
To learn more about each data source, go to the [Data sources](/docs/data-verification/data-sources/) page.
:::
---
## Release notes for Signicat Data Verification API
# Data Verification API release notes
---
### 11.12.2025
#### New sourceSpecific field is now available in the Ownership endpoint
##### Features
- The new optional `sourceSpecific` field is now available in [Organizations Ownership endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetOwnership_GET) responses.
- The field conveys extra source-specific information such as
- Number of shareholders
- Purpose
- Registration date
- Industries
- Addresses
- Unidentified shareholder counts
- The field can appear
- At the top level of the response
- Inside the top-level entity (for example: `attribute.sourceSpecific`)
- This functionality is backwards-compatible. If no extra data exists, the object is `null`.
- Fields inside `sourceSpecific` vary by source but are stable for the same source.
##### Sample response
:::details Expand/collapse sample response
``` json
{
"companies": [
{
"name": "LION BIDCO AS",
"organizationNumber": {
"domestic": "NO922093032",
"dunsNumber": null,
"legalEntityIdentifier": null
},
"percentage": 100,
"percentageRange": null,
"votingRights": null,
"votingRightsRange": null,
"integratedOwnership": 100,
"integratedOwnershipRange": null,
"sourceSpecific": {
"description": "Investeringsvirksomhet og i den forbindelse, direkte eller indirekte, eie eller forvalte aksjer og andre verdipapirer og drive tilhørende virksomhet.",
"purpose": "Investeringsvirksomhet og i den forbindelse, direkte eller indirekte, eie eller forvalte aksjer og andre verdipapirer og drive tilhørende virksomhet.",
"registrationDate": "2019-01-08T00:00:00.000Z",
"industries": [
{
"58.29": "Other software publishing"
},
{
"70.10": "Activities of head offices"
}
],
"address": {
"street": "c/o Signicat AS Beddingen 16",
"postalCode": "7042",
"city": "TRONDHEIM",
"country": "NO"
}
}
}
],
"persons": [],
"otherShareholders": [],
"sourceSpecific": {
"shareholderDataCompleteness": 24.6,
"totalShareholders": 732,
"directShareholdersCount": 1,
"legalPersonShareholdersCount": 300,
"unidentifiedShareholdersCount": 109,
"unidentifiedOwnershipPercentage": 70.4,
"maxOwnershipDepth": 11,
"highVotingLowOwnershipCount": 0
},
"metadata": {
"sources": [
"t-rank-evry"
],
"urls": [],
"lastChanged": "2025-12-10T02:02:29.000Z",
"rawJson": null,
"isCache": false
}
}
```
:::
---
### 25.09.2025
#### New data source supported by the API: OpenRegisters (Kausate)
**Data source:** `open-registers`
[OpenRegisters (Kausate)](https://www.kausate.com/) provides data and documents for organisations in Germany through the German Handelsregister (trade registers). The data source allows you to retrieve real-time current and chronological entity information, shareholder lists, articles of association and structured information on a company.
##### Features
- OpenRegisters (Kausate) is now available as a data source in the Data verification API to look up and verify organisation data in Germany.
- You can use the data source by specifying the query parameter `?source=open-registers` in the API request to the following endpoints:
- [Organizations Search endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Search_GET)
- [Organizations Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo)
- [Organizations Roles endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetRoles_GET)
- [Organizations Documents endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Documents_GET)
---
### 18.12.2024
#### New data source supported by the API: Kontakt- og reservasjonsregisteret (KRR)
**Data source:** `krr`
[Kontakt- og reservasjonsregisteret (KRR)](https://eid.difi.no/en/common-contact-register) provides email and phone number details for individuals in Norway. The data source allows you to retrieve information that you can use to send messages and documents electronically to your users.
##### Features
- KRR is now available as a data source in the Data verification API to look up and verify personal electronic contact information of people registered in Norway.
- You can use the data source by specifying the query parameter `?source=krr` in the API request to the following endpoints:
- [Persons Contacts endpoint](pathname:///apis/data-verification/#tag/Persons/operation/Person_GetContacts_GET)
---
### 26.11.2024
#### New industry codes in Det Centrale Virksomhedsregister (CVR)
**Data source:** `dk-cvr`
The Central Business Register (Det Centrale Virksomhedsregister, CVR) is the official registry of businesses and organisations in Denmark.
##### Features
The Danish Business Authority will update the industry codes (referred to as *Branchekode* in Danish) effective from the 1st of January 2025. In particular, certain companies will receive a new industry code as a result. Learn more in the [Danske Branchekoder 2025](https://www.dst.dk/da/Statistik/dokumentation/dansk-branchekode-opdateres) page on the Danmarks Statistik website.
In the Data Verification API, this update will impact the `industries.code` property in responses from the [Organisations - Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo).
### 01.07.2024
#### Companies House data source is now available in the API
**Data source:** `companies-house`
[Companies House](https://www.gov.uk/government/organisations/companies-house) is the official agency responsible for maintaining the register, and incorporating all forms, of companies in the United Kingdom.
##### Features
- Companies House is now available as a data source in the Data verification API to look up and verify organisation data in the United Kingdom.
- You can use the data source by specifying the query parameter `?source=companies-house` in the API request to the following endpoints:
- [Organisation Basic endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo)
- [Organisation Roles endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetRoles_GET)
- [Organisation UBO endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetUbo_GET)
---
### 10.04.2024
#### Schufa Identity Check data source is now supported in the API
**Data source:** `schufa`
##### Features
- The data source Schufa Identity Check (`schufa`) is now integrated into the [Identity verification endpoint](pathname:///apis/data-verification/#tag/Persons/operation/Person_VerifyAddress_GET).
- The data source `schufa` is available to verify a natural person's identity information in Germany.
- Use `schufa` to verify personal information when you want to ensure real-time validation during onboarding or re-validate data in a Know Your Client (KYC) process.
:::note About Schufa
[Schufa Holding AG](https://www.schufa.de/) is a German private credit bureau supported by creditors.
Learn more about Schufa at [https://www.signicat.com/registry-methods/schufa](https://www.signicat.com/registry-methods/schufa).
:::
When sending requests to the Identity verification endpoint, you can use the following input parameters: `country`, `givenName`, `surname`, `dateOfBirth`, `street`, `postalCode`, `city`, `gender` and `phoneNumber`.
Learn more about the Identity verification endpoint in the [API overview](/docs/data-verification/api-overview.mdx#identity-verification) documentation.
---
### 03.04.2024
#### Bisnode Consumer Intelligence (dnb-ci) data source is now supported in the API
**Data source:** `dnb-ci`
##### Features
- The data source Bisnode Consumer Intelligence (`dnb-ci`) is now integrated into the [Identity verification endpoint](pathname:///apis/data-verification/#tag/Persons/operation/Person_VerifyAddress_GET).
- The data source `dnb-ci` is available to verify a natural person's identity and address information in Norway, Sweden, Denmark and Finland - providing comprehensive country coverage.
- Use `dnb-ci` to verify personal information when you want to ensure real-time validation during onboarding or re-validate data in a Know Your Client (KYC) process.
When sending requests to the Identity verification endpoint, you can use the following input parameters: `country`, `givenName`, `surname`, `dateOfBirth`, `street`, `postalCode`, `city`, `gender` and `phoneNumber`.
Learn more about the Identity verification endpoint in the [API overview](/docs/data-verification/api-overview.mdx#identity-verification) documentation.
:::tip Note
To ensure a better hit on the results, provide as many input parameters as possible in your API request.
:::
---
### 20.01.2024
#### Renamed Information Service API to Data Verification API
##### Features
- The Information Service API has now been renamed to Data Verification API. The API URL remains the same: `https://api.signicat.com/info/lookup/`.
---
### 06.11.2023
#### Introduced the Identity verification endpoint
**Endpoint:** `identity`
##### Features
- Added new **Identity verification** method - GET `/info/lookup/countries/{country}/persons/identity/verify`.
:::tip Identity verification
With the Identity verification endpoint, you can verify a natural person's identity and address information.
Learn more in the:
- [Identity verification documentation](/docs/data-verification/api-overview.mdx#identity-verification)
- [Identity verification API reference](pathname:///apis/data-verification/#tag/Persons/operation/Person_VerifyAddress_GET)
:::
##### Features (deprecated)
- The **Address verification** endpoint is no longer available.
:::warning Note
Existing customers using the Address verification endpoint are not impacted.
:::
---
### 02.11.2023
#### Bisnode data source is now available in the Basic endpoint
**Data source:** `bisnode`
##### Features
- The data source Bisnode is now integrated in the [Persons Basic endpoint](pathname:///apis/data-verification/#tag/Persons/operation/Person_GetBasic_GET).
:::note All supported endpoints
You can use `bisnode` in the following endpoints:
- [Persons Basic](pathname:///apis/data-verification/#tag/Persons/operation/Person_GetBasic_GET) (New feature)
- [Persons Finance](pathname:///apis/data-verification/#tag/Persons/operation/Person_GetFinance_GET)
- [Organization Finance](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetFinance_GET)
:::
---
### 31.10.2023
#### Trapets data source supports Adverse Media in Screening endpoints
**Data source:** `trapets`
##### Features
- The data source Trapets (`trapets`) now supports `adverseMedia` in the `listType` for the screening endpoints. You can retrieve Adverse Media information both with the [Organization Screening endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Screening_GET) and the [Persons Screening endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/PersonGlobal_Screening_GET). Trapets provides global geographical coverage.
:::warning Note
`adverseMedia` is only available if you are using a production account. The feature is not available for sandbox accounts and a response error is returned instead.
:::
:::note All supported list types for screening
When requesting `trapets` data from the screening endpoint, you can choose among the following `listType` fields:
- `pep`
- `sanction`
- `adverseMedia` (New feature)
:::
#### Roles endpoint mapping logic updated
**Endpoint:** `roles`
##### Changes
- Minor technical mapping adjustments to the values returned in the [Roles endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetRoles_GET).
---
### 08.06.2023
#### Norway business register (NO-Brreg) added to Roles endpoint
**Data source:** `no-brreg`
##### Features
- Data source for Norway business register `no-brreg` is now available in the [Roles endpoint](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetRoles_GET). Customers can now fetch all the roles associated with an organisation using `no-brreg`.
:::note All supported endpoints
You can use `no-brreg` in the following endpoints:
- [Basic](pathname:///apis/data-verification/#tag/Organizations/operation/GetBasicOrganizationInfo)
- [Authorization](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetAuthorization_GET)
- [Search](pathname:///apis/data-verification/#tag/Organizations/operation/OrganizationGlobal_Search_GET)
- [Roles](pathname:///apis/data-verification/#tag/Organizations/operation/Organization_GetRoles_GET) (New feature)
:::
---
### 22.03.2023
#### Surepay v2.0
**Data source:** `surepay`
##### Features
- Surepay v2.0 is now integrated in the [Data Verification API](/apis/data-verification/).
- Surepay is now available to verify account holders in France.
##### Changes
- Minor technical mapping adjustments to the existing Surepay integration.
:::warning Note
Existing clients using the Surepay integration will not be impacted.
:::
To learn more, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
---
## Digital Evidence Management (DEM)
Signicat's Digital Evidence Management platform (DEM) is a RESTful web service that allows you to securely capture, store and manage audit trail data. This can include information on authentications, payment transactions or acceptance of GDPR consent messages and enables you to efficiently handle audits and inspections. The stored data can be secured, or sealed, using Signicat's [Qualified Timestamping Authority (QTSA)](#sealing-with-qualified-timestamps) services.
DEM can be used for full audits of identity verification, authentication and signature processes and complies with [Payment Services Directive (PSD2)](https://www.eba.europa.eu/regulation-and-policy/payment-services-and-electronic-money/regulatory-technical-standards-on-strong-customer-authentication-and-secure-communication-under-psd2) Dynamic Linking requirements.
Data that is stored using Signicat's Digital Evidence Management platform is owned and controlled by you, as the customer, who can add, retrieve and delete transaction data and relevant metadata on demand. You determine expiry date, or Time to Live (TTL), for stored data and can search both system-provided and custom user-provided metadata in real time. Signicat acts as the data processor.
### What data is stored?
Signicat's Digital Evidence Management platform stores the following data:
- [**System metadata**](#metadata) provided by Signicat.
- [**Custom metadata**](#metadata) provided by you, as the customer.
- A **custom payload** - This is the object that is protected by a timestamp.
- A **secured timestamp object** - This will be used for validation of the payload.
### Supported use cases
You can define and control use cases based on your business needs. Examples of common use cases for DEM can include:
- **Payment transactions** - Determine when a payment was made, what payment channel was used and if the payment triggered Strong Customer Authentication (SCA).
- **GDPR** - Audit consent, information rights and the right to be forgotten.
- **Know your customer (KYC) and Anti Money Laundering (AML)** - Retrieve events related to KYC and AML.
- **Fraud detection and prevention** - Prevent, trace and find evidence of fraud attempts.
- **Dispute handling** - Establish complaint handling mechanisms.
## Getting started
To access the DEM API, you will need a valid API client, which is a `client_id`/`client_secret` pair associated with either your organisation or with one of your accounts. The API clients are used to obtain access tokens, which are required by all DEM operations for API authorisation.
You can have multiple API clients for one account. These clients can have the following permissions, or a combination of them:
- **Write** (able to store records)
- **Read** (able to retrieve or search for records)
- **Update** (able to update Time To Live (TTL) of records)
When you have your API client, you must obtain an access token using the OAuth 2 protocol. This is required to consume Signicat's REST services. For general information on how to do this, refer to our [Quick start guide](/docs/eid-hub/quick-start/).
## API reference
In our Digital Evidence Management API reference, you can find information about the available endpoints and properties, as well as sample requests and responses.
* [**Digital Evidence Management API**](/apis/digital-evidence-management/): Our REST API for capturing audit trail data
## Using the API
The Digital Evidence Management API is used to store audits of transactional data or consent messages. A basic process varies, but will start with the following steps:
### Step 1: Obtain an access token
Acquire an access token using the OAuth 2.0 protocol.
The following is a cURL example of a request to receive an access token:
```bash
curl --location --request POST '/auth/open/connect/token' \
--header 'Authorization: Basic ' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials'
```
### Step 2: Create a new record
To create a record, make a [POST call to the records endpoint](pathname:///apis/digital-evidence-management/#operation/postNewRecord). There are four required parameters: `type`, `TTL`, `metadata` and `coreData`, as well as two optional parameters: `relations` and `auditLevel`.
#### Record types
Currently, the available record types are `GDPR`,`TRANSACTION`, `LOG_IN`, `SIGNATURE`, `SENSITIVE` and `OTHER`.
#### Time To Live (TTL)
Specifying the Time To Live (TTL) of a record is mandatory. TTL is defined as a positive integer of 2 or higher. This value indicates the number of days until the record is deleted.
:::tip Note
A separate [POST call to the records endpoint](pathname:///apis/digital-evidence-management/#operation/setExpiryDate) to set the expiry date for a given record is also available. This call allows you to **redefine** the TTL of a record in case you would like to change the expiry time of the specified record after the record has already been created.
:::
#### Metadata
The main purpose of metadata is to help in the construction of efficient search operations.
Some **system metadata** is automatically added to records by Signicat. System metadata includes:
- The type of event (GDPR, transaction, etc.)
- The time from a timestamp
- Time To Live (TTL)
You can define **custom metadata**. Examples of custom metadata are:
- Names
- Payment amounts
- Issuing bank account and beneficiary bank account
#### Coredata
The `coreData` field contains the data you want to protect and timestamp.
In many cases, you will want to duplicate some of the metadata elements in the `coreData` payload. Other elements of the payload can be authentication information such as a [JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519), certificates or SAML assertions. You can also include other objects such as image files. All binary data in the payload JSON structure needs to be BASE64-encoded.
#### Relations
The optional `relations` element can contain data on relations to other records.
#### Audit levels
The optional `auditLevel` element determines the level of timestamping and verification applied to the record. Signicat's DEM service only supports the `QUALIFIED` audit level.
- `QUALIFIED`: This option uses Signicat's [Qualified Timestamping Authority (QTSA)](/docs/qtsa/) to create a valid qualified timestamp token, which is stored to ensure the record can be validated. The time from the timestamp object is used in the system attributes (defined as `system.`).
:::note Deprecation Notice
The `SIMPLE` and `ADVANCED` audit levels are deprecated and no longer supported.
:::
#### Request example
The following example request body shows how to create a new record.
```json
{
"type":"SIGNATURE",
"TTL":2,
"metadata":{
"searchable_metadata": "searchable_value",
"Jaffa_cake":"is not a biscuit",
"number":42
},
"coreData": {
"secret":"Sealed and safe"
},
"relations":[
""
]
}
```
:::warning Important
For the time being, the maximum record size is 10 MB.
:::
## Other integration details
Once you have created a record, you can carry out different actions depending on use case:
- The [**records endpoint**](pathname:///apis/digital-evidence-management/#tag/records) allows you retrieve a list of records that match specific parameters. You can also retrieve individual records based on their ID and redefine the TTL of a record.
- The [**info endpoint**](pathname:///apis/digital-evidence-management/#tag/info) allows you to retrieve statistics on records in the database, such as custom metadata fields you have used.
### Searching for records
To search for a record, make a [POST call to the records endpoint](pathname:///apis/digital-evidence-management/#operation/query).
The query body consists of one or more operators (`and`, `or`). Each operator contains an array of several query objects. Each query object has 3 fields:
- `field`: The metadata field the operator should be applied to. Note that system attributes are defined as `system.` and user-defined fields as `custom.`.
- `operator`: The search operator (`eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `nin`, `contains`)
- `value`: The value the operator will use for the query
The available operators are:
- `eq`: equal to
- `ne`: not equal to
- `gt`: greater than
- `gte`: greater than or equal to
- `lt`: less than
- `lte`: less than or equal to
- `in`: `field` value in given array (value input)
- `nin`: `field` value not in given array (value input)
- `contains`: `field` value matches regex (value input)
#### Request example
The following example request body shows how to search for a record.
```json
{
"and": [
{
"field": "system.type",
"operator": "eq",
"value": "SIGNATURE"
},
{
"field": "custom.numberField",
"operator": "lt",
"value": 42
}
]
}
```
### Retrieving records
To retrieve a previously created record, make a [GET call to the records endpoint](pathname:///apis/digital-evidence-management/#operation/getRecordById). You can retrieve individual records based on their ID.
This GET call also validates the `coreData` payload to detect changes, using a secured timestamp object. You can read more about timestamping in the section on [Sealing with qualified timestamps](#sealing-with-qualified-timestamps) below.
:::warning Important
The ID you supply must conform to the UUID/GUID standard. Example: `123e4567-e89b-12d3-a456-556642440000`. This returns everything included in the record entity.
:::
### Sealing with qualified timestamps
Signicat can seal and secures critical data elements such as the subject and the consent that was given. This can be done by adding a qualified timestamp to these data elements using Signicat's [Qualified Timestamping Authority (QTSA)](/docs/qtsa/) services.
Timestamping data elements allows you to detect if the data has been modified and will bind the data to a proven time. The elements are then validated on retrieval.
---
## Authentication REST API
The Signicat Authentication REST API enables you to authenticate your end-users in an easy and secure way. With the Authentication REST API, you can implement various authentication flows in your backend systems. This authentication method offers less complexity when integrating compared to OIDC and SAML 2.0.
Compared to OIDC or SAML 2.0, the Authentication REST API's main advantages are:
- **REST standard**: Since this is just a very simple REST API, you do not need to implement complex protocols.
- **Wide support**: The API supports complex flows such as the headless flow.
However, note the following limitations:
- You always need a backend system to call the API securely.
- You may have to write more custom code instead of relying on an SDK like for OIDC and SAML.
## Available flows
The Authentication REST API supports the following authentication flows:
- [Redirect flow](#redirect-flow)
- [Headless flow](#headless-flow)
- [Embedded flow](#embedded-flow)
Learn more about each flow below.
### Redirect flow
The redirect flow allows you to pass a URL to your end-users which they will open in a browser.
In a redirect flow, end-users are redirected several times during the authentication session. At the end of this redirect chain, end-users are routed to the success `callbackUrl`, which corresponds to a location in your backend. Then, you can consume the result from the authentication session from the Authentication REST API. This includes information about the authenticated user (for example, subject).
### Headless flow
A headless flow, in the context of authentication and APIs, refers to a process that occurs without user interface (UI). In a headless flow, the frontend and backend components are decoupled allowing for greater flexibility to deliver multiple services that interact with the same backend service.
The headless flow allows you to provide your own user interface within your app or website. Requests are sent from your backend server to Signicat's Authentication REST API.
Headless flow is currently only available for the following eIDs:
- [Auðkennisappið](/identity-methods/audkenni-app/setup/#headless-flow)
- [itsme® - Headless for mobile App2App flows](/identity-methods/itsme/integration/app2app.mdx)
- Mobiil-ID - Documentation coming soon
- [Norwegian BankID - Headless flow](/identity-methods/nbid/integration-guide/auth-api-nbid/headless-nbid.mdx)
- Smart-ID - Documentation coming soon
- [Swedish BankID - Headless flow](/identity-methods/sbid/integration-guide/auth-rest-api/headless.mdx)
### Embedded flow
Embedded flows enable you to render the authentication flow inside an iframe in your application (as opposed to the redirect flow where you are redirecting the user to another page).
In an embedded flow, the authentication journey happens inside a component, like an iframe, embedded within your UI. In this scenario, your application manages the iframe and polling logic, creating a hybrid integrated experience for your end-users.
We support embedded flows for the following eIDs:
- [Norwegian BankID](/identity-methods/nbid/integration-guide/auth-api-nbid/embedded-nbid/)
- [Swedish BankID](/identity-methods/sbid/integration-guide/auth-rest-api/embedded/)
- [Email OTP](/identity-methods/email-otp/setup/authentication-api/embedded/)
- [SMS OTP](/identity-methods/sms-otp/setup/authentication-api/embedded/)
## API reference
In our Authentication REST API reference, you can find information about the available endpoints and properties, as well as sample requests and responses.
* [**Authentication REST API**](/apis/eid-hub/): Configure your Authentication REST API
## Tutorial video
This video shows you how to configure the Authentication REST API for the Signicat eID and Wallet Hub in the Signicat Dashboard.
---
## Migrating from Express
For the Signicat Digital Trust Platform (DTP), we have made the Signicat Authentication REST API more tightly integrated with the platform to take full advantage of its possibilities. However, we have taken care to make the migration from the old API in Express as seamless as possible.
## Key differences
- [Authorization](#authorization): DTP does not use the same access and identity and access management (IAM) control as Express.
- [Endpoints](#endpoints): The general flow is the same, but with minor differences.
- [Data models](#data-models): The request and response objects have slightly different structures.
- [Encrypted responses](#encrypted-responses): DTP does not sign encrypted responses.
In addition, there are some general differences between Express and DTP such as the concept of organisations and accounts, eIDs, platform differences. You can find more information about these concepts in the [Glossary](/docs/dashboard/glossary.mdx).
## Authorization
Signicat DTP features a richer and more powerful access and IAM control. Although technically different, it is practically similar as it is still using an OAuth2 client credentials flow.
In short, you need to use a new token URL, a new client (client ID and client secret) and a different scope.
:::info Want to learn more?
For more information on how to authorize, see the **Connect to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::
## Endpoints
We have made some minor changes to our endpoints, but the general structure remains much the same.
:::CustomTable{columnWidths="33% 33% 33%"}
| **Name** | **Endpoint** | **Change** |
| :----------------- | :------------------- | :----------------------------------- |
| Create session | `POST /sessions` | New parameter, `signicat-accountId`. |
| Retrieve session | `GET /sessions/{id}` | New parameter, `signicat-accountId`. |
| List sessions | `GET /sessions/{id}` | This endpoint has been deprecated. |
| Invalidate session | `GET /sessions/{id}` | This endpoint has been deprecated. |
:::
:::warning Deprecated endpoints
"List sessions" and "Invalidate session" have been deprecated because of a different way of treating non-permanent data in DTP. When a session expires in DTP (with `sessionLifetime`), it's completely deleted from our system. It's done this way to increase protection of PII and simplify data management.
:::
## Data models
We have improved the structure of the [request](#request) and [response](#response) objects to make them clearer and more concise.
### Request
:::CustomTable{columnWidths="33% 33% 33%"}
| **Old name (Express)** | **New name (DTP)** | **Comment** |
| :-- | :-- | :-- |
| `allowedProviders` | `allowedProviders` | Same field name, but new values: `["nbid", "sbid"]`. |
| `include` | `requestedAttributes` | New field name and new values (see [API specification](/apis/eid-hub/) for details). |
| `redirectSettings` | `CallbackUrls` | New field name and new values: `["success", "abort", "error"]`. |
| - | `sessionLifetime` | New field (not required). |
| - | `themeId` | New field (not required). |
:::
### Response
:::CustomTable{columnWidths="33% 33% 33%"}
| **Old Name (Express)** | **New Name (DTP)** | **Comment** |
| :-- | :-- | :-- |
| `url` | `authenticationUrl` | New field name, but the same purpose. |
| `status` | `status` | Same field name, but values are capitalised. |
| `identity` | `subject` | New field name and new values: (see [API specification](/apis/eid-hub/) for details). |
| `identity.providerId` | `subject.idpId` | New field name, but the same purpose. Field representing the user's unique ID from the eID. |
:::
## Encrypted responses
Although it is possible to encrypt the response you receive from Signicat, DTP does not sign the response (with a digital signature). This means that you only need to decrypt the response, as explained in [Encrypted responses from Signicat](/docs/eid-hub/authentication-api/receive-encrypted-responses.mdx) page.
---
## Receive encrypted responses from Signicat
Signicat can send encrypted responses. This means we will encrypt the responses on the given session.
All responses from Signicat are fully encrypted on the transport layer with HTTPS. You can implement message-level encryption (MLE) as an additional security layer.
This section explains how to set up and process encrypted responses.
:::warning Important
For FTN, you are required to receive encrypted responses. If you do not set this up correctly, FTN will fail and you will not be able to obtain any FTN authentication results.
:::
## Prerequisites
To use encrypted responses, you must first generate a key pair.
:::tip Note
You can use our website [JWK generator by Signicat](https://jwk-gen.signicat.guru/) to securely generate this key pair, or any other method that is convenient for you; for example, OpenSSL, or a JOSE or JWK library for the language of your choice.
:::
1. The key pair needs to be in a valid JWK format.
2. The technical requirements for the keys are:
### For RSA key types
:::CustomTable{columnWidths="50% 50%"}
| **Field name** | **Value** |
| :---------------- | :--------- |
| Algorithm (`alg`) | `RSA-OAEP` |
| Key type (`kty`) | `RSA` |
:::
For RSA, we support key sizes of 2048 bits and 4096 bits if required.
### For elliptic curve key types
:::warning Note
Support for Elliptic curve cryptography (ECC) key pairs will be available soon.
:::
:::CustomTable{columnWidths="50% 50%"}
| **Field name** | **Value** |
| :---------------- | :------------------------ |
| Algorithm (`alg`) | `ECDH-ES` |
| Curve (`crv`) | `P-256`, `P-348`, `P-521` |
| Key type (`kty`) | `EC` |
:::
## Implementation
To implement encrypted responses, you need to include the additional field `encryptionPublicKey` when making a request to the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint. You can find more details about this field in our API specifications.
Following this, all of your responses for both the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) and the [Get session status](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/GetSession) endpoints will be encrypted with this key. The responses will also be encrypted in our session storage. This ensures full encryption in the Authentication REST API.
### Example request
```json
{
"allowedProviders": ["nbid"],
"flow": "redirect",
"requestedAttributes": [
"firstName",
"lastName",
"dateOfBirth",
"nin"
],
"callbackUrls": {
"success": "https://postman-echo.com/get?status=success",
"abort": "https://postman-echo.com/get?status=abort",
"error": "https://postman-echo.com/get?status=error"
},
"encryptionPublicKey": {
"alg": "RSA-OAEP",
"e": "AQAB",
"kty": "RSA",
"n": "1soz_f_GSGVYfYwIRSu6mkIsyymeqjEXdO-24ffhZnrwKNEeqO9vwxVKHpAUMA55QGBhPl-epJjYjzy_24n-0qvJEwddLvo0cuO0N-ms0LhB8WlUwhLKp6pqj_AO46Pt7qyBNFlWQh3KF_UakAb1Jq1P97Ba0FAIXJBaTKvnZ5hxwJY5i2tPA_NNQT5D40nqc0BNWS0Iv6Ww9oYfQn3pecyOygTFGMTg2SQ3t-4XRGaKclOwExIWTJTv21slOBMJQLomO0hJtnRAB9aBZRgit8K41TzuBp_wpbFlYLoep8lRyG-n2A_1yHlww1P2pVzmlynNDO87ERek6EyI6uPZvQ",
"use": "enc"
}
}
```
### Example response
```http
HTTP/2 200
Content-Length: 2048
Content-Type: application/jose
Date: Tue, 07 Feb 2023 15:08:43 GMT
eyJh...QifQ.Qq5TQR...xN-PQ.ojSGehTV7xw_xE078sFnTg.in8a...SITqA.SyVNrXe0C3UkKBQ_AVyQiw
```
The response will now say `Content-Type: application/jose` instead of the usual `Content-Type: application/json`. This tells you that the response is a JWE (JWT) as per [RFC 7516: JSON Web Encryption (JWE)](https://www.rfc-editor.org/rfc/rfc7516).
You can now use your private key from the key pair you created earlier to decrypt this message. The payload of the JWE is a JSON structure that is exactly the same as a non-encrypted reply, so you will be able to continue with your normal implementation once you have decrypted the payload.
## Example code
:::warning Important
This code example is for illustrative purposes only. It is not intended for use in production. Signicat will not be held responsible if this code example is used inappropriately.
:::
```python
from jwcrypto import jwk, jwe
# ATTENTION: Insert your nested JWT (that you received from the Signicat Authentication REST API) here.
jwe_serialized = "eyJh...QifQ.Qq5TQR...xN-PQ.ojSGehTV7xw_xE078sFnTg.in8a...SITqA.SyVNrXe0C3UkKBQ_AVyQiw"
# For the sake of simplicity in this example, the JWKs have been manually loaded into a dictionary.
# In practice, you should do this in a secure manner. The jwe_private_key should be stored securely on your premises.
jwe_private_key = {
"alg": "RSA-OAEP",
"d": "IchOWqQUx_S2sRJqB5Ub5aDEYlTiuXJ8tb3xRgPCjieGZ-kSOTBlo-mQjZOMNU3FeOBf0xtffJR0tTyxEWLYM0LlHorRN28PekWBpiyo63AboRB3zgl-GdZmKcrwUJILPXeg376wYDhGvbNlkOMjQkjOk87HTc3Urthed4IvJH4N7SpHBuzFHucb_1Zcq7i_UZrvQecNZoODoeTJIeaN4LoN4AB63Jc75doVBvTqyyKl39VdrdDzsv17WOq_HjFe0KLwFGjK6VEQbiaNMS7Jh6XoKVkiVLKT2uzyzpWCHu68gB6BDuItlllhbMYYCW9yoC7mFkWroG_EZj8PJL-58Q",
"dp": "UU2ygH3JEjmyTEiOmNHSpoDjnn5JR0nmZDZ4AOrEUMuMmXbnkNfXN5vGmo8hBZbWUBcXN5CkeGysiFByldfw1oVRlNoA1np00Gtb_8RsaElcIr1aWSgACArCsbhplDNSzNDPjm6FvW21Rkdm0AwVmak7YgtMgodq1TLBUwd_-uE",
"dq": "VqinrWjEIgryjHdQmb_cFhxGFN167EvM5PSjrj3w1Dg6453MKZjriJmIT8LZbbcrLalkaeje2PK0Koy1ZEyBvmRHlZDShX8AigXeY2s478wWVk03bsJyWcrMO2Lokal_Zn6_ULJYkmIHPoXzzB56odEqxgQnP1ZM0O0nS2J76k0",
"e": "AQAB",
"kty": "RSA",
"n": "1soz_f_GSGVYfYwIRSu6mkIsyymeqjEXdO-24ffhZnrwKNEeqO9vwxVKHpAUMA55QGBhPl-epJjYjzy_24n-0qvJEwddLvo0cuO0N-ms0LhB8WlUwhLKp6pqj_AO46Pt7qyBNFlWQh3KF_UakAb1Jq1P97Ba0FAIXJBaTKvnZ5hxwJY5i2tPA_NNQT5D40nqc0BNWS0Iv6Ww9oYfQn3pecyOygTFGMTg2SQ3t-4XRGaKclOwExIWTJTv21slOBMJQLomO0hJtnRAB9aBZRgit8K41TzuBp_wpbFlYLoep8lRyG-n2A_1yHlww1P2pVzmlynNDO87ERek6EyI6uPZvQ",
"p": "2m4looTgE4Gx8Uu8mTjv3PGlHLYuG5zTIJAG9joxnOO-JdvIwUIi4Kc4QN-cJJpZsdpBQs5HKcI4F6TFccO_lx7q4xgXgzGBTMy6lLsYgFgIBM0SWXqQ3Ws35ewt40v9Zhs0kaRSpzuS0Pik90cwsPcMexB2BJ3kTSEgMctEDLE",
"q": "-7vDS1Cu9RuXX7Xktg6Ftn-FGiCQQ26is7s-ixwv0XGhV2nxzzKKhNcattYWFnOAA91NOzBy8XWaDMli2vNqqSlcDnvAZGpppv-nJRD3wyVvcYWV3Bi_xGsjh5NiyEC8RQOj5rzZ9jP3EJdw3pvfAZj_ncSfwpuGH9ESPaJssM0",
"qi": "coF8GU0fQ9-KcZfz2Vp8Si4MwzQElFwaAkJX64cZe57-IjDYWlU66VMB1tsoJbCWt_vWOSmOCXROVOSYIdI85y_W2PtSjRGxKInMlQ7MGpqhAVv75nD_k0yf2y8AFZk4SCoiVFlQWJ44Ke8vaf7FTKBCgzbznkY2xvBqYRv7N8Y",
"use": "enc"
}
# Loading JWK key
jwk_jwe_private_key = jwk.JWK()
jwk_jwe_private_key.import_key(**jwe_private_key)
jwetoken = jwe.JWE()
jwetoken.deserialize(jwe_serialized)
jwetoken.decrypt(jwk_jwe_private_key)
payload = jwetoken.payload.decode('utf-8')
print(payload)
```
---
## Test connections
This page describes how you can test an authentication with the Signicat Authentication REST API using **Postman**.
For testing purposes, this guide shows steps to complete a *redirect flow* using Norwegian BankID. However, you may easily adapt the instructions to test all the other eIDs available in the Signicat eID and Wallet Hub.
Additionally, you can find eID-specific test guides in the respect [eID documentation](/identity-methods/).
:::tip Sandbox account
We recommend you run test authentications by using a sandbox account.
:::
## Initial preparations
Before you can run a test authentication, make sure to complete the following configuration in the Signicat Dashboard.
:::tip New customers
If you are new to Signicat, we recommend you first read the [Get started with Signicat](/docs/) page.
:::
### Add an eID
To add an eID to your Signicat account, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. Click **+ Add new** in the top right.
3. Choose the eID from the list. Then, fill in any required configuration and click **Add**.
4. Now, review that the eID is available and displayed as "Active" in the eIDs page.
### Connect to the API
To learn how to connect to this API, follow steps 1-3 in the **Connect to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::note What permissions are required?
Ensure that you set permission **Authentication REST API** for your API client.
:::
## Test with Postman
You can make calls to the Authentication REST API using our Postman collection.
:::tip Testing only
Note that Postman is a tool for testing and learning about APIs. You should not rely on Postman in production.
:::
### 1. Import the Postman collection
You can fork or import the Postman collection by clicking the button below:
[](https://app.getpostman.com/run-collection/20756027-56b06e30-202c-43b6-8838-3eb0007ebb39?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D20756027-56b06e30-202c-43b6-8838-3eb0007ebb39%26entityType%3Dcollection%26workspaceId%3D3ea7a3cf-7777-4f42-b4e9-88876cfe660d)
To start using the Postman collection, do the following:
1. Fork or import the Postman collection.
2. Open Postman and select the **Signicat Authentication REST API** collection.
3. In the Variables tab, edit the following variables:
- `baseURL`: The base URL of the API. Set this to: `https://api.signicat.com/auth/rest`.
- `oauth_scope`: The scope. Set this to: `signicat-api`.
- `oauth_client_id`: The client ID of your API client. For example, this looks like `dev-red-pin-123`.
- `oauth_client_secret`: The client secret associated to your API client.
- `oauth_url`: The Authorisation URL. Set this to: `https://api.signicat.com/auth/open/connect/token`.
4. Save your variables by clicking the save icon or pressing Ctrl+S.
Now, you are ready to obtain an access token.
### 2. Obtain an access token
To authorise requests to the API, you need to pass the access token in your request. To obtain the access token with the Postman collection, do the following:
1. In the Postman collection, select the **Authorization** tab.
2. Scroll to the bottom and select **Get New Access Token**.
3. If the request is successful, review the Access Token and select **Use Token**.
You have now obtained the access token to authenticate to the API. When calling an API endpoint, you supply the access token in the HTTP `Authorization` header of your request.
:::tip Token lifetime
Tokens have a default expiry date. If a token expires, repeat the steps above to request a new token.
:::
### 3. Create an authentication session
:::tip Authentication flows
This guide shows an example authentication with the *redirect flow*. We also supports other flow types. Learn more in the [Authentication REST API](/docs/eid-hub/authentication-api/index.mdx) documentation.
:::
To begin an authentication flow, your application needs to build and direct the end-user to the authentication URL where the end-user can authenticate with their eID, such as Norwegian BankID.
To obtain the authentication URL, you send a POST request to the **Create a new session** endpoint with the appropriate parameters in the body of the request.
The body of the request might look like this:
```json
{
"flow": "redirect",
"requestedAttributes": [
"IdpId",
"nin",
],
"callbackUrls": {
"success": "https://example.com/success",
"abort": "https://example.com/abort",
"error": "https://example.com/error"
},
"allowedProviders": [
"nbid"
],
}
```
To create the authentication URL in the Postman collection, do the following:
1. In the left menu, expand the collection and select the **Create a new session** endpoint.
2. Edit the **Body** of your request. For example, you can use the example above.
3. In the endpoint window, select **Send** to send the request.
4. In the response window, select the **Body** tab to view the response payload.
5. Copy and paste the `authenticationUrl` in your browser to start an authentication session with the eID. In this case, this is Norwegian BankID.
**Example of response payload**
```json
{
"id": "181f6409-107b-4ad8-8bd1-3068b0bde9cf",
"accountId": "",
"authenticationUrl": "https:///broker/sp/external-service/login?messageId=4998966e-78ff-114b-b528-d79d423790a1&transactionId=10e8eead-6fdb-c649-a626-fc7cf12d590e",
"status": "CREATED",
"callbackUrls": {
"success": "https://example.com:443/success?sessionId=181f6409-107b-4ad8-8bd1-3068b0bde9cf",
"abort": "https://example.com:443/abort?sessionId=181f6409-107b-4ad8-8bd1-3068b0bde9cf",
"error": "https://example.com:443/error?sessionId=181f6409-107b-4ad8-8bd1-3068b0bde9cf"
},
"allowedProviders": [
"nbid"
],
"language": "en",
"flow": "redirect",
"requestedAttributes": [
"idpId",
"nin",
],
"sessionLifetime": 1200,
"expiresAt": "2026-05-29T09:04:35.7543967+00:00"
}
```
When implementing login with the redirect flow, you should design your application to redirect the end-user to the `authenticationUrl`.
### 4. Authenticate with test users
You need a Norwegian BankID test user to complete the authentication. For example, you can use the following credentials:
:::CustomTable{columnWidths="33% 33% 33%"}
| National identity number | One-time password | Password |
| :----------------------- | :---------------- | :--------- |
| `01100844350` | `otp` | `qwer1234` |
| `10103933108` | `otp` | `qwer1234` |
:::
:::tip Test users for Norwegian BankID
Pre-generated test users for Norwegian BankID may become unavailable after a series of failed attempts. If this happens, you can [generate more test users](/identity-methods/nbid/test.mdx#order-test-user).
:::
Once you have completed the authentication flow, you can retrieve the response from successful authentication.
### 5. Get the authentication results
When using the API, you can check the status of the authentication session at any stage. When the end-user authenticates successfully, you receive the user data attributes in the response. To do this:
1. In the left menu, expand the **id** folder and open the **Get session status** endpoint.
2. To check the session status, select **Send**. This sends an HTTP GET request using the session ID obtained from the **Create a new session** endpoint.
3. Inspect the response in the **Body** tab of the response window.
If the authentication was successful (`"status": "SUCCESS"`), you find the end-user data attributes in the `subject` field.
```json
{
"id": "9588dba1-f1f6-45f2-8f70-a25b6c3ed858",
"accountId": "",
"authenticationUrl": "https:///broker/sp/external-service/login?messageId=1c5400f8-7933-3f49-8913-a4dd38754c75&transactionId=5291ae63-b355-464e-adc8-1c15363401ff",
"status": "SUCCESS",
"provider": "nbid",
"subject": {
"id": "bBl527R7ya3Xp...rQ0lXgh72uoRSnImM=",
"idpId": "9578-XXXX-4-243538",
"nin": {
"value": "01100844350",
"issuingCountry": "NO",
"type": "BIRTH"
}
},
"callbackUrls": {
"success": "https://example.com:443/success?sessionId=9588dba1-f1f6-45f2-8f70-a25b6c3ed858",
"abort": "https://example.com:443/abort?sessionId=9588dba1-f1f6-45f2-8f70-a25b6c3ed858",
"error": "https://example.com:443/error?sessionId=9588dba1-f1f6-45f2-8f70-a25b6c3ed858"
},
"loa": "high",
"allowedProviders": [
"nbid"
],
"language": "en",
"flow": "redirect",
"requestedAttributes": [
"idpId",
"nin"
],
"sessionLifetime": 1200,
"expiresAt": "2026-05-29T09:10:56.9541901+00:00"
}
```
:::note Success!
You have now completed an authentication flow using the Authentication REST API.
:::
## Next steps
Learn more about the Authentication REST API and explore our eIDs documentation.
* [**Authentication REST API**](/apis/eid-hub/): Configure your Authentication REST API
* [**Supported eIDs**](/identity-methods/): View and learn how to integrate with the eIDs
---
## Authentication Vault
The Signicat Authentication Vault allows you to automatically store the data you receive from an end-user authentication with electronic identities (eIDs).
The data you can store includes transaction logs and the personal information of your users. These are stored securely as records in the Signicat [Digital Evidence Management (DEM)](/docs/digital-evidence-management/). You can access and manage the records directly in the Signicat Dashboard or through the DEM API.
To start using the Authentication Vault, you first need to configure it in the Signicat Dashboard. You can find more information on this page.
## How it works
An authentication flow typically consists of the following steps:
1. Connect your application to an eID with an authentication protocol.
2. Direct end-users to the authentication server where they verify themselves.
3. Route the end-user back to your digital service.
4. Send backend requests to retrieve the end-user's personal data.
5. Verify and process the end-user's data for your use case.
All throughout, your application sends/receives a series of requests/responses to/from the Signicat eID and Wallet Hub. Typically, the data is only available *temporarily* for the scope of the authentication session and is forgotten thereafter.
**Why use the Authentication Vault**
The Authentication Vault allows you to store the data for longer periods of time beyond the scope of an authentication session. It achieves this by storing the response in the Signicat DEM database, so that you can always retrieve it at a later point.
After you activate the Authentication Vault, all your authentication transactions are automatically stored in the DEM database. The data is saved in records that you can view in the Signicat Dashboard and retrieve with the DEM API.
**Available settings**
The Authentication Vault is configurable and allows you to control the following settings:
- Obfuscating the national identity number.
- Limiting storage to specific eIDs.
- Defining retention periods for records in the DEM database.
:::warning Supported authentication protocols
The Authentication Vault can help you store records obtained from connections with the following protocols:
- OpenID Connect (OIDC)
- Authentication REST API (only *redirect flow*)
Note that no data is stored for transactions with SAML 2.0.
:::
## Get started
To start using the Authentication Vault, you first need to set it up in the Signicat Dashboard.
To learn how to set it up, try it out and manage the records, make a selection using the buttons below:
* [**Set up**](/docs/eid-hub/authentication-vault/setup): Learn about activating and configuring the vault
* [**Try it out**](/docs/eid-hub/authentication-vault/try-it-out): Try out an end-to-end flow to see it in action
* [**Manage records**](/docs/eid-hub/authentication-vault/manage-records): Learn about viewing and retrieving records
---
## Manage records
On this page, you can learn about:
1. How to view records in the Signicat Dashboard.
2. How to retrieve records with the DEM API.
## View records in the Dashboard
You can view and manage your records in the Signicat Dashboard by following these steps:
1. Go to **Dashboard** > **Products** > [**Digital Evidence Management**](https://dashboard.signicat.com/dem).
2. Select a record.
3. Now, you can view the data and manage the record:
- To view the raw data in full, select **Expand lines**.
- To download the record in PDF format, select **Get report (PDF)**.
- To delete the record, select **Delete**. Then, confirm the action in the pop-up box.
:::note Expiry date
When a record reaches its expiry date, it is deleted automatically and cannot be restored.
:::
### How to search for records
Records are assigned a `searchAttribute` to uniquely identify them across services. You can search for records by using the `searchAttribute` attribute field.
To search for a record in the Signicat Dashboard, do the following:
1. Go to **Dashboard** > **Products** > **eID and Wallet Hub** > [**Audit logs**](https://dashboard.signicat.com/audit).
2. In the Audit Logs, click your transaction to view its log data.
:::tip Filter
To filter your authentication transactions, click **Filter** at the top-right corner, then tick **Service Name** and select **Broker**. Additionally, you may also filter by eID by ticking **Advanced > Idp** and selecting your eID. Authentication responses have the `authn_response` type.
:::
3. In the transaction overview, locate the **Summary** on the left-hand side, then copy the **Transaction ID**. You will need this later to identify your record.
4. Click the **Signicat** logo at the top-left corner to return to the Dashboard homepage.
5. Now, go to **Dashboard** > **Products** > [**Digital Evidence Management**](https://dashboard.signicat.com/dem). Here you can view all your records.
6. Click **Add Condition+** and select **AND** in the dropdown menu.
7. In the **Value** field, paste the transaction ID you copied in step 3. For example, the condition should read as `searchAttribute` = `5291ae63-b355-464e-adc8-1c15363401ff`.
8. If a record matches your transaction ID, you will view the record in the results. Then, click the record to view its content.
## Retrieve records with the DEM API
You can retrieve records from DEM using the [DEM API](/apis/digital-evidence-management/). Learn more about connecting to the API and accessing records in the [DEM API guide](/docs/digital-evidence-management/#using-the-api).
:::warning Important
By default, the DEM API is not included in the billing plan for the Authentication Vault. To gain access to the DEM API, you need to purchase it separately, as part of the [Digital Evidence Management (DEM)](/docs/digital-evidence-management/) product.
:::
## Useful links
You can read more about Digital Evidence Management in the documentation:
* [**DEM documentation**](/docs/digital-evidence-management/): Learn more about the Digital Evidence Management product
* [**DEM API reference**](/apis/digital-evidence-management/): Explore the endpoints and attributes of the DEM API
---
## Set it up
On this page, you can learn about how to set up the Authentication Vault in the Signicat Dashboard.
:::note Supported authentication protocols
The Authentication Vault can help you store records obtained from connections with the following protocols:
- OpenID Connect (OIDC)
- Authentication REST API (only *redirect flow*)
Note that no data is stored for transactions with SAML 2.0.
:::
## Prerequisites
If you do not have an account already, then you need to sign up to the Signicat Dashboard for free and complete the initial preparations. To do this:
1. Sign up to the [Signicat Dashboard](https://login.signicat.com/ownidp/web/registration) and register your profile.
2. Ensure that you have created an [organisation](/docs/dashboard/organisation-management/organisations.mdx).
3. Create an [account](/docs/dashboard/organisation-management/accounts.mdx). To do this:
1. Go to **Signicat Dashboard** > [**Organisation**](https://dashboard.signicat.com/org-mgmt/), then select **+ Add account**.
2. Enter an account name, choose the type of account that you want to create, then select **Create**.
4. Create a [domain](/docs/dashboard/organisation-management/domains/). To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains/), then select **+ Add domain**.
2. To create a standard domain, enter a domain name. Then, select **Add domain**.
3. To create a custom domain, follow the instructions in the [Custom domains](/docs/dashboard/organisation-management/domains/custom/) documentation.
:::tip Account types
We recommend that you create a sandbox account to test our services before going live. Sandbox and production accounts must be set up separately.
:::
:::info Production account
To use the Authentication Vault in a production account, you need to first purchase it. When you are ready to do this, contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Dashboard.
:::
#### Permissions
Since authentication data contains personally identifiable information (PII) of the end-users, the data is stored in DEM using *sensitive* records. For this reason, you should manage access to the records in the Dashboard appropriately.
To view, edit and create records from the Authentication Vault, users in the Signicat Dashboard require at least one of the following permissions:
- **DemSensitiveViewer**: Access to read sensitive records in DEM.
- **DemSensitiveWriter**: Access to read and write sensitive records in DEM.
- **DemSensitiveEditor**: Access to read, write and update sensitive records in DEM.
To provision these permissions in the Signicat Dashboard, go to **Dashboard** > **Access Management** > [**Permissions**](https://dashboard.signicat.com/ownidp-management/permissions) page. You can learn more about role management in our [Managing roles and permissions](/docs/dashboard/access-management/managing-roles-and-permissions.mdx) documentation.
:::note Additional DEM permissions
There are more permissions to choose from when handling DEM records, as explained in the [DEM documentation](/docs/digital-evidence-management/).
:::
## Configuration
To enable and configure the Authentication Vault in your Signicat account, do the following:
1. Go to **Dashboard** > **Products** > [**eID and Wallet Hub**](https://dashboard.signicat.com/auth).
2. In the left sidebar menu, select **Authentication Vault**.
3. In the Authentication Vault configuration page, set the following attributes:
| Attribute | Description |
|:--------- |:----------- |
| *Status* | Toggle to enable/disable the Authentication Vault product. |
| *Time to live (TTL)* | Number of time units (in digits) to store the records for. Must be between 2 days and 84 months. |
| *Unit* | Time unit. Choose between "Days" and "Months". |
| *Selected authentication providers* | Choose for which eIDs to store data. You must select at least one. |
| *Obfuscate NIN* | Determines whether to show or obfuscate the national identity number (NIN) of the end-user. If ticked, NIN is obfuscated. |
:::note Note
These settings apply only to the Authentication Vault product and do *not* affect the global configuration of Digital Evidence Management (DEM) in your account. You manage, activate and configure the DEM product separately.
:::
4. Select **Save** to save the configuration. This will enable the Authentication Vault in your Signicat account.
Your configuration might look like this:
:::info What happens next?
Once you have activated the Authentication Vault, the data is automatically stored in the DEM database for all future authentication sessions for the eIDs you have configured. Then, the records become readily available for you to view in the Signicat Dashboard.
:::
## Next steps
You are now ready to try an authentication test run and manage your records.
* [**Try it out**](/docs/eid-hub/authentication-vault/try-it-out): Try out an end-to-end flow to see it in action
* [**Manage records**](/docs/eid-hub/authentication-vault/manage-records): Learn about viewing and retrieving records
---
## Try it out
On this page, you can learn how to run an end-to-end flow to test the Authentication Vault and how records are generated during a test authentication with Norwegian BankID.
**Steps overview**
1. Configure the Authentication Vault to store records for [Norwegian BankID](/identity-methods/nbid/).
2. Run a test authentication session.
3. Review the records in the Signicat Dashboard.
### 1. Configure the Authentication Vault
To follow along this tutorial, configure your Authentication Vault, as follows:
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**Authentication Vault**](https://dashboard.signicat.com/bca/authentication-vault/edit).
2. In the Authentication Vault configuration page, set the following attributes:
- **Time to live (TTL)/Unit**: 2 Days
- **Selected authentication providers**: Norwegian BankID
- **Obfuscate NIN**:
3. Click **Save** to update the configuration.
### 2. Try out an authentication
To test an authentication with a test user, follow the guide for the respective authentication protocol:
- [Test connections with OIDC](/docs/eid-hub/oidc/test-connections/).
- [Test connections with REST API](/docs/eid-hub/authentication-api/test-connections/).
To simulate an authentication with a test user, you can use the following test credentials:
:::CustomTable{columnWidths="33% 33% 33%"}
| National ID | OTP | Password |
|:------------- |:----- |:---------- |
| `01100844350` | `otp` | `qwer1234` |
:::
:::tip Test users for Norwegian Bank ID
Pre-generated test users for Norwegian BankID may become unavailable after a series of failed attempts. If this happens, you can [generate more test users](/identity-methods/nbid/test.mdx#order-test-user).
:::
### 3. Review the records
Once the authentication completed successfully, the records become available in the Signicat Dashboard. To view the record of your authentication, do the following:
1. Go to **Signicat Dashboard** > **Products** > [**Digital Evidence Management**](https://dashboard.signicat.com/dem).
2. Select a record.
3. Click **Expand lines** to view the raw data (JSON).
**Example raw data**
```json
{
"id": "",
"metadata": {
"searchAttribute": "b1a1f071-8273-e04c-82db-eb03d14d1228"
},
"systemMetadata": {
"type": "SENSITIVE",
"expiryDate": "2024-06-23T00:00:00Z",
"createdDate": "2024-06-21T00:00:00Z",
"createdDateTime": "2024-06-21T07:35:01Z",
"createdBy": "",
"auditLevel": "QUALIFIED"
},
"coreData": {
"response": {
"subject": "cpPchEZj4bUtjH6ZKXVmVD8COVKHzei7s9LPT2MCTM4=",
"subjectType": "PERSISTENT",
"issuer": "https://auth.current.bankid.no/auth/realms/current",
"idp": "nbid",
"loa": "high",
"transactionId": "b1a1f071-8273-e04c-82db-eb03d14d1228",
"attributes": [
{
"name": "nbidSid",
"dataType": "string",
"value": "d36d3efd-b973-4cbb-9856-f0901b182593"
}
],
"standardAttributes": {
"name": {
"fullName": "Gustavo Silva",
"firstName": "Gustavo",
"lastName": "Silva"
},
"nin": {
"value": "***",
"issuingCountry": "NO",
"type": "BIRTH"
},
"dateOfBirth": "1908-09-29"
}
}
},
"timestampData": {
"timestamp": "MIIJCzADAgEAMIIJAgYJKo...q9cpN2WSu5e/",
"timestampValid": true
},
"relations": [
{
"relationID": "",
"type": "SENSITIVE",
"_links": {
"self": {
"href": "https://api.signicat.com/dem/records/"
}
}
}
],
"_links": {
"self": {
"href": "https://api.signicat.com/dem/records/"
}
}
}
```
Note the following relevant fields:
:::CustomTable{columnWidths="25% 75%"}
| Attribute | Description |
|:------------------- |:----------- |
| `id` | Record ID in UUID/GUID standard. You can use this in your requests to the DEM API to retrieve the record. |
| `metadata` | Searchable field to filter records in DEM. |
| `systemMetadata` | Metadata object with information about creation and expiry date, source and record type. |
| `systemMetadata.type` | The type of the record. Always set to `SENSITIVE` when using the Authentication Vault. |
| `systemMetadata.auditLevel` | The level of timestamping and verification applied to the record. Always `QUALIFIED`. |
| `coreData.response` | Authentication response containing personal information of the end-user. Note how `nin` is obfuscated `***` in this example, according to the Authentication Vault configuration. |
| `timestampData` | Qualified timestamp generated by Signicat's [Qualified Timestamping Authority (QTSA)](/docs/qtsa/). |
:::
:::info Success!
You have completed an authentication with Norwegian BankID and stored your record in DEM.
:::
## Next steps
Learn about the different ways to access your records.
* [**Manage records**](/docs/eid-hub/authentication-vault/manage-records): Learn about viewing and retrieving records
---
## IdP scoping
IdP scoping allows you to define which eIDs to make available for authentication to your users.
One of the advantages of using IdP scoping is the ability to show only eIDs that are relevant to your users, thus shielding the other eIDs active in your Signicat account. This feature is also known as IdP discovery or IdP routing rules.
## How it works
Let's imagine a scenario where you have implemented a login button on your web application, registered it with Signicat eID and Wallet Hub, and have configured multiple eIDs in your account, such as Norwegian BankID and eHerkenning.
When a user wants to log in to your app, they click the login button to authenticate with their personal eID credentials. IdP scoping allows you to automatically route the user to the appropriate eIDs (for example only eHerkenning) and shield them from seeing the other eIDs active in your account (in this case Norwegian BankID). You may want to do this for a multitude of reasons, such as geographical relevance.
:::tip How to skip the provider selection screen
If you specify only one eID in your request, you automatically redirect the user to the authentication page of the eID, thus skipping the provider selection screen.
:::
IdP scoping allows you to control the following aspects of an authentication session:
1. [**eID scoping**](#eid-scoping): Defines which eIDs are available for authentication to the user.
2. [**Provider scoping**](#provider-scoping): Further specifies the provider, bank or issuer to make available for an eID. For example, with iDIN you can choose to direct the end-user to _one of_ the issuing banks. Note that only certain eIDs support provider scoping.
The rest of this document describes and shows examples to handle both cases.
## eID scoping
To use eID scoping, you provide the list of eIDs you want to offer as parameters in the authorisation request. How you specify the eIDs varies per authentication protocol. Here, select the tab of the authentication protocol you use in your integration:
When using the OIDC, you can specify the eIDs in the `acr_values` parameter of your authorisation request. In particular, you need to use the `idp` key in the `acr_values` with the format `acr_values=idp:idp_name,other_idp_name`.
For example, to display Email OTP and FTN to your end-users, the authorisation request could look like this:
```curl {9}
https:///auth/open/connect/authorize?
&client_id=
&response_type=
&redirect_uri=
&scope=openid%20profile
&state=
&code_challenge=ABC123
&code_challenge_method=S256
&acr_values=idp:otp-email,ftn
```
To learn more about `acr_values`, see the [acr_values](/docs/eid-hub/oidc/oidc-implementation.mdx#acr_values) documentation.
When using SAML, you can specify the eIDs in the `ProviderID` property of the `IDPEntry` field, as shown below:
```xml {8-12}
ENTITY_ID
```
If you define only one eID in the payload, the end-user is routed to the IdP-specific authentication page, automatically skipping the IdP selection screen during authentication. To let the end-user choose among a subset of eIDs active in your account, specify multiple values with the `IDPEntry` field.
When using the Signicat Authentication REST API, you can specify the eIDs in the `allowedProviders` field in the payload of the request to the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint.
For example, to display Email OTP and FTN to the end-user in the eID selection screen, use:
```json
...
"allowedProviders": [
"otp-email",
"ftn",
],
...
```
At the start of an authentication flow, the end-user will be able to choose between Email OTP and FTN in the provider selection screen.
:::warning Scoping applies only to active eIDs
When using IdP scoping, you can specify only eIDs that are active in your account.
:::
:::tip Scoping codes for your eIDs
You can find scoping codes for your active eIDs in the **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn) page.
You can view a list of codes for the most common eIDs in the [eID scoping codes](/docs/eid-hub/concepts/idp-scoping/#eid-scoping-codes) section below.
:::
### Skip eID selection screen
If you define *only one* eID with IdP scoping, then the end-users are automatically routed to the IdP-specific authentication page, thus skipping the IdP selection screen — the page where all your active eIDs are typically displayed at the beginning of end-user authentication.
For example, to automatically direct the end-user to SMS OTP, build your authorisation request as shown below. Select the tab according to the authentication protocol you want to use:
To automatically direct the end-user to SMS OTP with OIDC, you need to define `acr_values=idp:otp-sms` in your authorisation request:
```curl {9}
https:///auth/open/connect/authorize?
&client_id=
&response_type=
&redirect_uri=
&scope=openid%20profile
&state=
&code_challenge=ABC123
&code_challenge_method=S256
&acr_values=idp:otp-sms
```
To automatically direct the end-user to SMS OTP with SAML 2.0, you need to define `ProviderID="otp-sms"` in your `AuthnRequest` request:
```xml {8-12}
ENTITY_ID
```
To automatically direct the end-user to SMS OTP with the Authentication REST API, you need to define `allowedProviders` in the body of the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint, as shown below:
```json
...
"allowedProviders": [
"otp-sms",
],
...
```
The examples shown above allow you to shield the end-user from seeing other eIDs that are active in your account and route the end-user directly to the eID of your choice.
## Provider scoping
Certain eIDs are comprised of a network of identity providers (or issuers), such as banks, that are responsible for authenticating their own customers. Your application can route your end-users automatically to one specific identity provider, by scoping the identity provider in the authentication request.
In the table below, you can find parameters for the eIDs that support provider scoping:
:::CustomTable{columnWidths="20% 20% 60%" minTableSize="800px"}
| eID | Parameter | Providers |
|----------|-------------|----------------------------------|
| FTN | `ftn_idp` | View the list of FTN issuers in the eID documentation for [FTN](/identity-methods/ftn/attributes-reference.mdx#idp-scoping). |
| iDIN | `idin_idp` | Learn more about iDIN issuers in the [iDIN Setup](/identity-methods/idin/setup.mdx#issuer-bank-selection-screen) guide. |
| Smart-ID | `dokobit_idp` | Allows you to select the country for an authentication. Possible values: `be`, `ee`, `lt`, `lv`. Learn more in the [Smart-ID](/identity-methods/smart-id/setup/) documentation. |
:::
For examples of requests with provider scoping, choose the appropriate authentication protocol tab below:
To route your end-users directly to a bank/issuer authentication portal, you can specify the provider code in the `acr_values` parameter. For authentications with the Finnish Trust Network (FTN), you can specify the FTN provider with the `ftn_idp` parameter in the ACR values.
The following example show how to route authentication to the Aktia Bank portal by customising the query parameter in your authorisation request:
`acr_values=ftn_idp:fi-aktia,fi-pop,fi-op`
To route your end-users directly to a bank/issuer authentication portal, you can specify the provider code the `RequestedAttribute` of your SAML 2.0 request. For example, for authentications with the Finnish Trust Network (FTN), you can specify the FTN provider with the `signicat:param:ftn_idp` attribute in your SAML request, as shown below:
```xml {4,10}
fi-aktia
```
To serve a specific provider in an authentication session, you can use the `additionalParameters` field in the payload of the request to the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint. For example, for authentications with the Finnish Trust Network (FTN), you can customise your payload, as shown below:
```json {3}
...
"additionalParameters": {
"ftn_idp": "fi-aktia,fi-pop,fi-op"
},
...
```
For more examples and parameters, see the respective eID documentation:
- [FTN](/identity-methods/ftn/attributes-reference.mdx#provider-scoping)
- [iDIN](/identity-methods/idin/setup.mdx#issuer-bank-selection-screen)
- [Smart-ID](/identity-methods/smart-id/setup/)
## eID scoping codes
You can view the most common eIDs scoping codes in the table below.
:::tip Scoping codes for your eIDs
You can find scoping codes for your active eIDs in the **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn) page.
:::
:::CustomTable{columnWidths="50% 50%"}
| eID | Scoping codes |
| ------------------------------------- | --------------------------- |
| Auðkennisappið | `audkenni-app` |
| BeID | `be-smartcard` |
| buypass | `buypass` |
| Czech Bank iD | `bankid-cz` |
| DigiD | `digid` |
| DigiD CombiConnect | `digid-combiconnect` |
| eHerkenning | `eherkenning` |
| Email OTP | `otp-email` |
| eParaksts Mobile | `eparaksts-mobile` |
| Estonian ID Card | `et-smartcard` |
| Finnish eIDs (FTN) | `ftn` |
| Finnish ID Card | `fi-smartcard` |
| Freja eID | `freja` |
| ID Austria | `idaustria` |
| iDIN | `idin` |
| ID-porten | `idporten` |
| itsme® | `itsme` |
| Latvian ID Card | `lv-smartcard` |
| Lithuanian ID Card | `lt-smartcard` |
| MitID | `mitid` |
| MitID Business | `mitid-business` |
| MitID Private to Business | `mitid-private-to-business` |
| MobileID | `mobileid` |
| mojeID | `mojeid-pl` |
| Norwegian BankID | `nbid` |
| Personalausweis | `npa` |
| Polish ID Card | `pl-smartcard` |
| Samleikin | `samleikin` |
| Signicat IAM (SIAM) | `ownidp` |
| SK Mobile-ID | `sk-mobileid` |
| SK Smart-ID | `sk-smartid` |
| Skilríki á korti | `is-smartcard` |
| Skilríki á síma | `audkenni-mobileid` |
| SMS OTP | `otp-sms` |
| Sistema Pubblico di Identità Digitale (SPID) | `spid` |
| Suomi.fi | `suomifi` |
| Swedish BankID | `sbid` |
| Swedish BankID Digital ID Card | `sbid-idcard` |
| Simulator* | `simulator` |
:::
\* The simulator is a tool for testing. Learn more in the [simulator documentation](/docs/eid-hub/e-ids/simulator/).
---
## Concepts
You can learn about eID and Wallet Hub concepts in our guides.
* [**IdP scoping**](/docs/eid-hub/concepts/idp-scoping): Control which eID your end-users authenticate with
* [**Levels of Assurance**](/docs/eid-hub/concepts/levels-of-assurance): Set the degree of confidence with an eID
* [**Localisation**](/docs/eid-hub/concepts/localisation): Language settings and internationalisation
* [**Prefilling user information**](/docs/eid-hub/concepts/prefilling-information): Pre-populate login flows with user data
* [**Single Sign-On (SSO)**](/docs/eid-hub/concepts/single-sign-on): Keep your users logged in across sessions
* [**Subject**](/docs/eid-hub/concepts/subject): A unique identifier for the end-user
---
## Levels of Assurance
The Level of Assurance (LoA) measures the degree of trust or confidence in the claimed identity of a person. It indicates how certain you can be about the claimed identity of your end-users when they use an eID to access your online services.
This page provides conceptual information about the LoA supported by the eIDs in the eID and Wallet Hub, next to explanations and examples to help you configure the right level for your authorisation requests.
## How it works
The Signicat eID and Wallet Hub supports four different Levels of Assurance (LoA):
:::CustomTable
| Level of Assurance | Code | Description | eIDAS |
|:-------------------|:-------|:------------|:------|
| *Unspecified* | `unspecified` | This level is undefined, and no information about the assurance level is available. The service providing the authentication cannot determine the level. For example, MobileID returns this level in its responses. | |
| *Low* | `low` | This eIDAS level offers a moderate degree of confidence in the person's claimed identity. Single-factor authentication, such as a password, is sufficient for authentication use cases. During onboarding, this level might involve self-registration on a website, without any identity verification. | |
| *Substantial* | `substantial` | This eIDAS level requires at least two-factor authentication. For example, a username and password in combination with a time-based token meet this requirement. For onboarding, end-user's identity information must be provided and verified. | |
| *High* | `high` | This eIDAS level demands strong authentication measures to protect against duplication or tampering by potential attackers during authentication. For example, authentication using a smartcard, such as a national ID card, meets this requirement. For onboarding, an in-person registration process is mandatory. | |
:::
When connecting to an eID, you can specify the LoA for authentication.
## Specify LoA in requests
You determine the LoA for an authentication by specifying it as a parameter in your authorisation request. How to do that varies per authentication protocol.
The table below shows how to request a specific (for example `high`) level of assurance with the different protocols supported by the eID and Wallet Hub:
:::CustomTable
| Protocol | Query parameter |
|------------------------ |-----------------|
| OpenID Connect (OIDC) | `acr_values=loa:high` |
| Authentication REST API | `"requestedLoa":"high"` |
| SAML 2.0 | `` `high` `` |
:::
:::note Default LoA
If you don't specify any LoA in your authorisation request, the *minimum* LoA supported by the eID is used by default. For a complete list of values, refer to the [LoA supported by eIDs](#loa-supported-by-eids) section below.
:::
### Authorisation request examples
How you pass the LoA in your requests varies per authentication protocol:
To specify the LoA with OIDC, define `acr_values=loa:` in your authorisation request. For example, to ask for LoA `high`:
```curl {9}
https:///auth/open/connect/authorize?
&client_id=
&response_type=
&redirect_uri=
&scope=openid%20profile
&state=
&code_challenge=ABC123
&code_challenge_method=S256
&acr_values=loa:high
```
To specify the LoA with SAML 2.0, define the parameter in the Authentication Context Class Reference (`AuthnContextClassRef`) element in your `AuthnRequest` request. In the `AuthnContextClassRef`, you must pass the value of the **Name** field that you define in the mapping inside the [LoA contract](/docs/eid-hub/saml-2-0/saml-loa-contracts/).
For example, to ask for LoA `high` you could build your request like this:
```xml {9-11}
ENTITY_ID
high
```
To specify the LoA with the Authentication REST API, define `requestedLoa` in the body of the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint. For example, to ask for LoA `high`:
```json {2}
{
"requestedLoa": "high",
"callbackUrls": {
"success": "https://example.com/success",
"abort": "https://example.com/abort",
"error": "https://example.com/error"
},
"allowedProviders": [...],
"requestedAttributes": [...],
"flow": "redirect",
"sessionLifetime": 600,
"returnUrl": "https://example.com/auth_callback",
"requestDomain": "myapp.app.signicat.com"
}
```
:::info Security validation
The Signicat eID and Wallet Hub ensures that the same, or a higher, LoA is used for authentication. Learn more in the [Security validation](#security-validation) section.
:::
## View LoA in responses
After an authentication is successful, the response you receive from the Signicat eID and Wallet Hub contains the level of assurance that the end-user authenticated with.
To find out how the LoA is returned in the response, choose the appropriate authentication protocol below:
After a successful authentication, you receive the LoA in the `acr` claim of the ID token, according to the [ID Token specifications](https://openid.net/specs/openid-connect-core-1_0.html#IDToken). For example, an authentication performed with LoA High, returns `acr: "high"` in the payload of the ID Token.
```json {9}
{
"iss": "https://example.sandbox.signicat.com/auth/open",
"sub": "pZsWJxH7eOfKa9Y3CR2mxTElnTAhu6o2ZWKOCpyOjWY=",
"aud": "sandbox-vivid-blade-759",
"nonce": "n-0S6_WzA2Mj",
"iat": 1742917663,
"exp": 1742918263,
"auth_time": 1742917660,
"acr": "high"
}
```
After a successful authentication, you receive the LoA in the Authentication Context Class Reference (`AuthnContextClassRef`) inside the `AuthnStatement` of the SAML assertion.
```xml {4}
high
```
The `AuthnContextClassRef` indicates the value of the **Name** field that you define in the mapping inside the [LoA contract](/docs/eid-hub/saml-2-0/saml-loa-contracts/).
After a successful authentication, you receive the LoA in the `loa` property of the payload of the [Get session status](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/GetSession) endpoint. For example, an authentication performed with LoA High, returns `"loa": "high"` in the payload.
```json {8}
{
"id": "911a3193...4afd058d25ff",
"accountId": "a-sdge-XXXX",
"authenticationUrl": "https://example.sandbox.signicat.dev/login",
"status": "SUCCESS",
"subject": {...},
"callbackUrls": {...},
"loa": "high"
}
```
## Filter eIDs by LoA
When you have multiple eIDs active in your account and you start an authentication process, the eID and Wallet Hub authorisation server displays all the eIDs to your end-users in the eID selection screen. Typically, you control and restrict the selection of eIDs with [IdP scoping](/docs/eid-hub/concepts/idp-scoping.mdx).
When you specify a certain LoA in your request, only the eIDs that support the same level (or higher) will be displayed on the eID selection screen. For example, if you start an authentication request with LoA `substantial`, end-users can only choose among eIDs that support level `substantial` or `high`.
### Example
Let's imagine a scenario where you have set up your integration to connect to the following eIDs:
- SMS OTP (`low`)
- Swedish BankID (`substantial`)
- MitID (`low`, `substantial`, `high`).
If your application starts an authentication requesting LoA `substantial`, the following happens:
- SMS OTP is *not* displayed in the selection eID selection screen. LoA `low` is excluded.
- Swedish BankID and MitID are available in the eID selection screen.
- End-users can choose between Swedish BankID and MitID for authentication.
- Authentications occur with a (minimum) Substantial level of assurance.
## Security validation
If an eID authenticates end-users with LoA *lower* than requested by your application, the eID and Wallet Hub returns an error and the authentication fails. Before completing an authentication, the eID and Wallet Hub checks the validity of the LoA by applying the following algebraic inequality:
`unspecified < low < substantial < high`
:::info Example scenario
If you send a request with LoA *Substantial* but the eID returns a response obtained with LoA *Low*, the Signicat eID and Wallet Hub terminates the authentication process and returns an error.
:::
### Validation rules
During an authentication process, the eID and Wallet Hub checks that the LoA returned by an eID meets the following requirements:
- If the LoA in the response is *lower* than what you requested in your authorisation request, the eID and Wallet Hub returns an error and the authentication process fails.
- If the LoA in the response is *equal* or *higher* than what you requested in your authorisation request, the authentication process is valid and proceeds accordingly.
**Exceptions**
In SAML 2.0 connections with the `` element in the request:
- If the LoA in the response is *different* (not equal) from what you requested, the eID and Wallet Hub returns an error and the authentication process fails.
## LoA supported by eIDs
The table below shows the levels of assurance supported by each eID:
:::CustomTable
| **eID** | **Supported LoA** |
| ------------------------------------- | ------------------------------------- |
| Auðkennisappið | `high` |
| .beID | `high` |
| Buypass | `high` |
| DigiD | `low`, `substantial`, `high` |
| DigiD CombiConnect | `low`, `substantial`, `high` |
| eHerkenning | `low`, `substantial`, `high` |
| Email OTP | `low` |
| eParaksts Mobile | `high` |
| Estonian ID Card | `high` |
| Finnish ID Card | `high` |
| Freja eID | `low`, `substantial` |
| FTN | `substantial` |
| ID Austria | `substantial`, `high` |
| iDIN | `substantial` |
| ID-porten | `substantial`, `high` |
| itsme® | `substantial`, `high` |
| Latvian ID Card | `high` |
| Lithuanian ID Card | `high` |
| MitID | `low`, `substantial`, `high` |
| MitID Business | `low`, `substantial`, `high` |
| MitID Private to Business | `low`, `substantial`, `high` |
| MobileID | `unspecified` |
| mojeID | `low`, `substantial`, `high` |
| Norwegian BankID | `substantial`, `high` |
| Personalausweis | `high` |
| Polish ID Card | `high` |
| Samleikin | `substantial` |
| SK Mobile-ID | `high` |
| SK Smart-ID | `high` |
| Skilríki á kortid | `high` |
| Skilríki á síma | `high` |
| SMS OTP | `low` |
| Sistema Pubblico di Identità Digitale | `low`, `substantial`, `high` |
| Swedish BankID | `substantial` |
| Swedish BankID Digital ID Card | `substantial` |
| Simulator | `unspecified`, `low`, `substantial`, `high` |
:::
:::warning Important
Some eIDs are not eIDAS-notified. In such cases, we map the response from the eID to the closest eIDAS equivalent. However, the process of obtaining an account for these eIDs may not fully comply with eIDAS requirements and the eID may not have been legally validated.
:::
---
## Localisation
You can handle different languages within your applications with Signicat. This page describes how localisation is handled during an authentication flow.
## How it works
The Signicat eID and Wallet Hub is localised to the languages shown in the table below. Note that English is the default (fallback) language.
:::CustomTable{columnWidths="50% 50%"}
| Language | Code |
| :--------- | :-------- |
| Danish | `da` |
| Dutch | `nl` |
| English (default) | `en` |
| Estonian | `et` |
| Finnish | `fi` |
| French | `fr` |
| German | `de` |
| Greek | `el` |
| Icelandic | `is` |
| Italian | `it` |
| Latvian | `lv` |
| Lithuanian | `lt` |
| Norwegian | `no` |
| Polish | `pl` |
| Swedish | `sv` |
:::
:::note Language codes
Languages are formatted as lowercase two-letter codes in ISO 639-1. For example, `en` or `no`.
:::
### Order of priority
The language displayed on the graphical user interface (GUI) during an authentication flow depends on competing factors. The logic that determines what language is ultimately displayed to your end-users follows this order of priority:
1. **High**: The authorisation request (authentication URL) your application sends.
2. **Medium**: User browser settings (`Accept-Language` header).
3. **Low**: eID method language support.
This relationship can also be represented by this formula:
`ui_locales` / `language` (request) > `Accept-Language` (browser) > `en` (fallback)
Note that English is always the fallback language.
### Authentication language
When you start an authentication session and specify the language as a query parameter (for example, with `ui_locales` in OIDC), the following happens:
1. The service tries to show content in the language defined in your request.
2. If the language is not supported, then the service tries the language in the user browser settings.
3. If language in the user browser settings is also not supported, then localisation defaults to English.
However, note that this may vary depending on the step in an authentication flow, as explained in the section below.
### Authentication steps
An authentication session involves routing end-users through multiple screens and domains, which may affect localisation. A typical user journey involves the following steps:
1. The user wants to authenticate in your application/website. Here, you manage localisation on your side.
2. Optional. You direct the user to the eID selection screen where users can choose the eID method to authenticate with. Since this is part of the Signicat eID and Wallet Hub, you can control the language with query parameters in the authentication URL.
:::note Optional
Note that you may skip this step if you route the user directly to the eID portal with [IdP scoping](/docs/eid-hub/concepts/idp-scoping.mdx), or when you only support one eID.
:::
3. The user is routed to the eID authentication portal. Localisation depends on the languages supported by the eID method.
4. The user is redirected back to your application/website. Similarly to step 1, you manage localisation on your side.
You can learn more about how this works for different scenarios in the [Examples](#examples) section.
:::tip Our recommendation
We recommend that you let the end-users control the localisation settings, either automatically through their browser settings or by choosing supported languages in a dropdown list (if available). You should override the language only in specific cases.
:::
## How to edit the UI language
When you want to overwrite the default language for the GUI, each authentication protocol requires that you adhere to the appropriate syntax. Below, you can find examples for each authentication protocol:
To change the language of the GUI, you need to define the query string parameter `ui_locales` in your OIDC authorization request. For example, you can set the language to Greek (`ui_locales=el`) by passing the following in your request:
```bash {5}
https:///auth/open/connect/authorize?
&client_id=OIDC_CLIENT_ID
&response_type=GRANT_TYPE_CODE
&redirect_uri=REDIRECT_URI
&ui_locales=el
&scope=OIDC_SCOPES
```
To change the language of the GUI, you need to specify the language by using the `signicat:param:language` parameter in the SAML `AuthnRequest` Extensions. For example, you can set the language to Greek (`el`) by passing the following in your request:
```xml {4,10}
el
```
To change the language of the GUI, you need to specify the `language` parameter in the payload of your request to the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint. For example, you can set the language to Greek (`"language": "el"`) by passing the following in your request:
```json {3}
{
"flow": "redirect",
"language": "en",
...
"callbackUrls": {
"success": "https://example.com/success",
"abort": "https://example.com/abort",
"error": "https://example.com/error"
}
}
```
## Examples
The following examples show how localisation works for different authentication scenarios.
### Supported language
Below, you find examples of how authentication flows look like when both the eID and Wallet Hub and the eID method support the language configuration that you or your users require.
#### Scenario 1: Default
Imagine an authentication session where your application does not specify the language settings.
:::info Authentication configuration
- End-user browser language settings: *Norwegian*
- Authentication URL language: *Not specified*
- eID method: *Email OTP* \*
\*Note that [Email OTP](/identity-methods/email-otp/about-email-otp/#language-support) supports Norwegian.
:::
This will result in the following localisation in the authentication flow:
1. eID selection page: *Norwegian*
2. Email OTP page: *Norwegian*
:::note Explanation
In this scenario, the user browser settings determine the language for authentication because your request did not specify the language and Norwegian is supported by both the Signicat eID and Wallet Hub and Email OTP.
:::
During authentication, your end-users will see with the following screens:
#### Scenario 2: Specify language
Imagine an authentication session where your application specifies the language settings.
:::info Authentication configuration
- End-user browser language settings: *English*
- Authentication URL language: *Norwegian* (`ui_locales=no`)
- Authentication method: *Email OTP* \*
\*Note that [Email OTP](/identity-methods/email-otp/about-email-otp/#language-support) supports Norwegian.
:::
This will result in the following localisation in the authentication flow:
1. eID selection page: *Norwegian*
2. Email OTP page: *Norwegian*
:::note Explanation
In this scenario, the language parameter you passed in your request determine the language for authentication. This is possible because Norwegian is supported by both the Signicat eID and Wallet Hub and Email OTP.
:::
During authentication, your end-users will see the following screens:
### Unsupported language
When you initiate an authentication session with a language that is supported by the Signicat eID but not supported by the eID method, the language might change during authentication to adjust to the eID method requirements.
:::info Authentication configuration
- End-user browser language settings: *French*
- Authentication URL language: *French* (`ui_locales=fr`)
- Authentication method: *Norwegian BankID* \*
\*Note that Norwegian BankID only supports Norwegian and English.
:::
This will result in the following localisation in the authentication flow:
1. eID selection page: *French*
2. Norwegian BankID: *Norwegian*
During authentication, your end-users will see the following screens:
:::note Unsupported language
When the user browser setting language is not supported by the Signicat eID and Wallet Hub and you do not specify the language in the authorisation request, then localisation defaults to English.
:::
---
## Prefilling user information
When your app already knows some information about a specific user, you can include such information as a hint in an authentication process.
Prefilling allows you to pre-populate user data in the request to an eID provider. Typically, you reuse information that you have previously collected such as an email address, phone number or username. Passing data as a hint either displays the information to the user on screen or automatically skips a step in the authentication flow.
Here are some advantages of prefilling user information:
- Simplify and enhance the user experience within your app.
- Offer more user-centric, intuitive, and efficient authentication flows.
- Save the user time by pre-populating or skipping screens.
- Ensure that an authentication request is tailored to a specific user associated with the data you pass to the identity provider.
## How it works
Let's suppose that you already know the national identity number (NIN) of a user trying to authenticate with your app. For example, you collected the NIN in a previous step in the app or keep it stored in a database.
A flow where you pre-fill user information would look like this:
1. You already know the NIN of the user.
2. The user wants to authenticate with your app.
3. You pass the NIN as a hint to the identity provider (eID).
4. The identity provider pre-populates the NIN on the login screen.
5. The user reviews the NIN and proceeds, instead of having to enter the value manually.
:::note Security considerations
When prefilling user information, developers must be aware of security risks and implement mitigation strategies to protect user data and application integrity. Learn more about it in the [Security considerations](#security-considerations) section below.
:::
## How to pre-fill user information
To dynamically pre-fill user data, you specify the values as parameters in the authorisation request to the eID. How you pass data in your request varies per authentication protocol and provider.
To view how to use prefilling with an authentication protocol, select the appropriate tab below:
When using OpenID Connect (OIDC), you pass user data with the `login_hint` parameter.
The format is a space-separated list of key-value pairs: `login_hint=key1:value1 key2:value2`. For example, use `login_hint=email:email%40example.com` to pass the email address of the end-user to the eID. Note how `%40` is the URL encoded version of the `@` sign.
For example, to suggest the email address of the end-user in the Email OTP authentication screen your authorisation request might look like this:
```curl {9-10}
https:///auth/open/connect/authorize?
&client_id=
&response_type=
&redirect_uri=
&scope=openid%20profile%20idp-id
&state=
&code_challenge=ABC123
&code_challenge_method=S256
&acr_values=idp:email-otp
&login_hint=email:email%40example.com
```
:::tip Format: URL encoding
To ensure the property value is correctly interpreted in your OIDC authorisation request, you should format it using URL encoding. For example, use the URL encoded (percent encoding) `%2B447700900000` string to represent the `+44 7700900000` phone number.
:::
Learn more about `login_hint` in the [login_hint](/docs/eid-hub/oidc/oidc-implementation.mdx#login_hint) documentation.
You can pass prefilled information dynamically in your SAML 2.0 request. To include pre-filled attributes with `` dynamically in the `` itself, you embed attributes in an extension (``).
For example, to suggest pre-fill the email address (`signicat:prefilled:email`) in the authentication screen, your request might looks like this:
```xml {10-18}
ENTITY_ID
email@example.com
```
When using the Signicat REST API, you pass user data in the `prefilledInput` field in the payload of the request to the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint.
For example, to suggest the email address of the end-user in the authentication screen, your request might looks like this:
```json
...
"prefilledInput": {
"email": "email@example.com",
},
...
```
Learn more about `prefilledInput` in the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint of the REST API documentation.
In the authentication flow, the end-user views the email address already pre-populated on the screen. For example, when prefilling the email address using [Signicat Email OTP](/identity-methods/email-otp/), the authentication screen looks like this:
Note that certain eIDs might instead skip one of the screens/steps in the flow. For example, if you pre-fill the NIN in your request to Norwegian BankID, the page where end-users typically enter their NIN is skipped by default. Instead, the end-user is directed to the next page in the flow, where they enter their password. This is to prevent that the NIN changes.
For an overview of supported prefilling properties, see the next section below.
## Supported properties
The table below shows what properties Signicat supports for prefilling user information in an authorisation request:
:::CustomTable{columnWidths="50% 50%"}
| **Name** | **Description** |
| :------------------ | :------------------------------ |
| `nin` | National identification number. |
| `mobile` | Mobile phone number. |
| `dateOfBirth` | Date of birth (YYYY-MM-DD). |
| `email` | Email address. |
| `username` | Username or User ID. |
| `deviceID` | Mobile Device ID. |
| `firstName` | First name. |
| `lastName` | Last name. |
| `bankAccountNumber` | Bank account number. |
| `organisation` | Organisation name. |
:::
**Note**: SAML 2.0 requires the following format: `signicat:prefilled:`. For example, `signicat:prefilled:email`.
:::warning Coverage
Note that certain identity providers support only a subset of the properties listed in the table above. For an overview of the values supported by an eID, see the [eIDs](/docs/eid-hub/e-ids/) documentation.
:::
## Security considerations
A live implementation in production should adhere to the highest security standards. When setting up your app to pre-fill user information, keep the following security considerations in mind:
### Validate input and output
Validating input consistency helps prevent potential security issues, such as user impersonation or man-in-the-middle attacks.
When prefilling user information in the authorisation request, you must verify that the value you prefill matches the corresponding value returned by the eID in the response. For example, if you prefill `user@example.com` in the login hint, confirm that the same value is included in the response from the eID.
If there is a mismatch between the prefilled value and the response value, your app should reject the session and prompt the user to authenticate again. Do not rely only on the prefilled value to identify a user.
### Use signed requests and Pushed Authorization Requests (PAR)
When setting up your app for prefilling user information with OIDC, the following measures help you mitigate any security risks:
- [Encrypted or signed requests](/docs/eid-hub/oidc/advanced-security/send-encrypted-signed-requests.mdx): ensures the integrity and authenticity of the `login_hint` and other parameters.
- [Pushed Authorization Requests (PAR)](/docs/eid-hub/oidc/advanced-security/pushed-authorization-requests-par.mdx): transmits parameters through a backchannel, protecting them from exposure in the browser or query strings.
## Other resources
Below you find examples of prefilling user information:
- [Example with MobileID](/identity-methods/mobileid/integration-guides/oidc/ciba-flow/implementation.mdx)
- [Example with Swedish BankID](/identity-methods/sbid/integration-guide/oidc-sbid/#login_hint-prefill-user-information)
- [Example with SMS OTP](/identity-methods/sms-otp/setup/oidc/#prefill-user-information)
- [Example with Email OTP](/identity-methods/email-otp/setup/oidc/#prefill-user-information)
- [Pre-filling with SAML 2.0](/docs/eid-hub/saml-2-0/saml-requested-attributes/#prefilled-information)
---
## Single Sign-On
Single Sign-On (SSO) allows you to keep users logged in across multiple services over time. When you enable SSO, your users only need to log in the first time they access your app without having to authenticate again when they come back later.
:::warning Limited support
Currently, we only support SSO at the eID and Wallet Hub level for SAML 2.0. Therefore, the information on this guide only applies to SAML 2.0. We also support SSO at the OIDC level. Learn more about SSO for OIDC in the [OIDC implementation](/docs/eid-hub/oidc/oidc-implementation.mdx#single-sign-on-sso) guide.
:::
## How SSO works
The eID and Wallet Hub SSO stores a token (session cookie) in the browser of the user to identify them when they return to authenticate with your application. The token does not contain any personal identifiable information. Based on the token and the parameters in the authentication request (for example, LoA and attributes), the eID and Wallet Hub checks whether the SSO is still applicable and handles the authentication appropriately.
When you activate SSO in the eID and Wallet Hub, Signicat keeps the login response for a user session after a successful login transaction. The next time (within the same session) a new login transaction starts, the end user will not have to log in again. Instead, the same response that Signicat stored in the first login transaction will be automatically returned to your application. The response will contain the same subject identifier and any other attribute you requested previously.
:::info SSO lifetime
The SSO process happens within the context of a user session. If the user closes the browser, SSO will terminate and the user must re-authenticate. Technically, this means that the SSO is non-persistent.
:::
### Levels of SSO
Note that SSO may occur at different levels. We distinguish between the following levels:
1. eID and Wallet Hub (described on this page)
2. OIDC server (see the [OIDC documentation](/docs/eid-hub/oidc/oidc-implementation.mdx#single-sign-on-sso))
3. IdP or eID (depends on the identity provider)
When integrating with an eID using the Signicat eID and Wallet Hub, it is important to consider the interactions that might occur between different SSO levels.
### Technical considerations
Note that SSO does not work when:
- The IP of the end-user changes from one authentication to the next.
- The level of assurance (LoA) requested in a subsequent request is higher than the LoA used in the initial login.
- Your account configuration changes between sessions so that the authentication provider is no longer active in your account.
- You scope an eID (see [IdP scoping](/docs/eid-hub/concepts/idp-scoping.mdx)) differently than in the initial request.
- You send an OIDC authentication request with `prompt=login`.
- You send a SAML authentication request with `forceAuthn=true`.
- You connect using the Signicat Authentication REST API, which does not support SSO.
In any of the above scenarios, the end-user must re-authenticate.
## Enabling SSO
You can enable SSO at the eID and Wallet Hub level in the Signicat Dashboard. To do this:
1. Log in to the [Dashboard](https://dashboard.signicat.com).
2. Navigate to **Products** > **eID and Wallet Hub** > [**Settings**](https://dashboard.signicat.com/bca/settings/edit).
3. Select **Enabled** in the **SSO settings** dropdown.
4. Configure the SSO-related settings:
:::CustomTable{columnWidths="25% 50% 25%"}
| Name | Descriptions | Default value |
|-------------------|---------------------|----------------------------------|
| Session duration | The length of time before the SSO session expires. This is the time after which the user must re-authenticate. | 30 |
| Unit | The time unit (minutes or hours). | Minutes |
| Use rolling validity | Tick this checkbox to extend the remaining session duration every time the user log in. For example, if the remaining session duration is 10 minutes and the user logs in again, then the total session time will equal 10 minutes plus the value of *Maximum session duration*. | Off |
| Maximum session duration | Time to add to the overall session duration every time a user logs in. | 30 |
| Unit | The time unit (minutes or hours). | Minutes |
:::
5. Scroll at the bottom of the page and select **Save** to persist the changes.
After you enable SSO, these settings apply to all future authentication transactions started using this account.
:::note SSO configuration applies at the account level
When you enable SSO in the Signicat Dashboard, SSO is configured at the account level.
{/* TODO: update to all protocols when supported */}
All authentications transactions with SAML 2.0 for this account will enforce SSO, by default.
:::
## Skipping SSO
You can bypass the SSO configuration in the Dashboard by providing specific parameters in an authentication request. How to do this varies per authentication protocol.
:::note Skipping SSO applies to all levels
When bypassing SSO in your authentication request, SSO is skipped across *all* levels. Therefore, end-users must always re-authenticate, regardless of any other SSO level configuration.
:::
When sending an authentication request with OIDC, the `prompt` attribute allows you to ignore any existing session and prompt the user to re-authenticate. To do this, set the `prompt=login` parameter in your authentication request, as shown below:
```curl {9} title="OIDC Authentication request with prompt=login"
https://example.sandbox.signicat.com/auth/open/connect/authorize?
client_id=sandbox-vivid-blade-759
&response_type=code
&redirect_uri=https://oauth.tools/callback/code
&state=1734687023840-WGZ
&scope=openid%20profile%20nin
&code_challenge=7aEnwazbpKXHjOYbISsHWbtAWn33fE9cgDpS0y4-0UM
&code_challenge_method=S256
&prompt=login
```
The above request bypasses SSO and prompts the user to re-authenticate.
Note that SSO is still enabled for future requests *without* `prompt=login`. Skipping SSO is transient and different from forcing logout.
When sending an authentication request with SAML 2.0, the `ForceAuthn` attribute allows you to ignore any existing session and prompt the user to re-authenticate. To do this, set the `ForceAuthn="true"` attribute in the `` element of your SAML request, as shown below:
```xml
ENTITY_ID
XML_SIGNATURE
```
The above request bypasses SSO thus prompting the end-user to re-authenticate.
Note that SSO is still enabled for future requests *without* `ForceAuthn="true"`. Skipping SSO is transient and different from forcing logout.
:::warning Not supported
The Signicat Authentication REST API does *not* support SSO, by design. That means that end-users are required to authenticate every time they access or return to your services.
:::
{/* TODO: needs more info: If you pass as additional parameter `skip_sso` it will skip the eID and Wallet Hub level SSO, but not necessarily the SSO at the IdP level. */}
## Other resources
- [SSO at the OIDC server](/docs/eid-hub/oidc/oidc-implementation.mdx#single-sign-on-sso)
---
## Subject
The subject uniquely identifies the end-user that performed an authentication transaction. It allows you to correlate the end-user activity across multiple authentication sessions.
For different protocols, we return the subject using the following attributes/claims in the response:
:::CustomTable{columnWidths="50% 50%"}
| Protocol | Attribute/claim |
|------------------------ |--------------|
| OIDC | `sub` |
| Authentication REST API | `subject.id` |
| SAML 2.0 | `NameID` |
:::
:::note The subject is always hashed
After an authentication transaction, you receive the subject *always* in **hashed** form. Hashing converts the subject into a fixed-length, irreversible value that ensures consistency and privacy-sensitive identification of an individual without exposing their personal information.
:::
:::info How to receive the raw subject
You can also request the raw (unhashed) subject. To do this, you need to specify an additional query parameter in your request, as explained in the [How to receive the raw subject](#how-to-receive-the-raw-subject) section.
:::
## Hashing algorithm
We generate the hashed subject using the same hashing algorithm for all protocols with the following function:
```curl
Hashed_Subject = Replace(Base64(Sha256(output_of_proprietary_algorithm)))
```
Here is a step-by-step overview:
- **Sha256**: The hashing algorithm. Input bytes are created using the `output_of_proprietary_algorithm`, which is comprised of the following input elements:
- `idp`: Signicat-specific code to indicate the eID used for authentication. For example, `nbid` for Norwegian BankID.
- `idpId`: Raw subject, as provided by the eID (identity provider). Learn more in the [Raw subject](#raw-subject-and-the-idpid-attribute) section.
- `organizationId`: Uniquer identifier of your organisation, as registered in the Signicat Dashboard.
- **Base64**: Applies Base64 encoding to the hashed input string from the previous step.
- **Replace**: Replaces all `+` and `/` characters with `-`.
## Subject types
eIDs may return different subject values for the same end-user, thus making it difficult to track the end-user across authentication sessions.
To ensure integrity, we distinguish between two types of subject:
- **Persistent**: An eID always supplies the exact same value to identify a specific end-user across sessions.
- **Transient**: The subject varies across authentication sessions. For example, Finnish Trust Network (FTN) provides a different subject identifier for each new session.
Below you can find out how we process each subject type.
## Raw subject and the idpId attribute
We process the raw subject, referred to as `idpId`, from the response we receive from the eID (third-party). The raw subject output varies for each eID, depending on availability and the type of subject.
We apply the following logic to generate the `idpId` attribute that we send you:
- If an eID returns a **Persistent** subject identifier to Signicat, we use this value as the `idpId` to generate the hashed subject.
- If an eID returns a **Transient** subject or does not return any subject identifier to Signicat, we try to generate a persistent hashed subject from another attribute. The criteria to choose an attribute is that it must be unique and consistent to identify a specific end-user. For example, we may select the National Identity Number (`nin`) as the `idpId`.
For details on how we process transient (or missing) raw subjects for an eID, refer to the specific [eID](/docs/eid-hub/e-ids/) documentation.
### How to receive the raw subject
After an authentication transaction, you always receive the hashed subject. To also receive the *raw subject*, you need to request it additionally by specifying a query parameter (`idpId`) in your request. How you format the parameter varies per authentication protocol.
The table below shows how to request the raw subject through the `idpId` parameter for the different protocols:
:::CustomTable{columnWidths="50% 50%"}
| Protocol | Parameter (request) |
|------------------------ |---------------------|
| OIDC | `scope=idp-id` |
| Authentication REST API | `"requestedAttributes":["idpId"]` |
| SAML 2.0 | `` |
:::
After the authentication transaction, you will find the raw subject in the payload of the response. These are the attributes in the response per protocol:
:::CustomTable{columnWidths="50% 50%"}
| Protocol | Attribute (response) |
|------------------------ |-----------------|
| OIDC | `idp_id` |
| Authentication REST API | `subject.idpId` |
| SAML 2.0 | `idpId` |
:::
---
## Auth0 integration guide (with OIDC)
Signicat's electronic identities ([eIDs](/docs/dashboard/glossary.mdx#eids)) can be integrated in an Auth0 tenant to authenticate end-users through the Auth0 platform.
- **Auth0** provides an Identity Access Management (IAM) platform that helps companies manage and secure user authentication into applications.
- **Signicat** provides an identity hub with many eIDs, suitable for onboarding new users and authenticating recurring users. A list of supported providers is available in the [eIDs](/docs/eid-hub/e-ids/) section.
Auth0 customers can easily add Signicat services with simple configuration steps, rather than spending time and effort on development capacity. Using Auth0's Custom Social Connections, you can integrate your tenant with any OAuth 2.0 provider. For example, you can connect to the eIDs offered by Signicat, such as Norwegian BankID.
Follow the instructions on this page to learn how to integrate Signicat's identity hub into your Auth0 tenant using a [Custom Social Connection](https://auth0.com/docs/authenticate/identity-providers/social-identity-providers/oauth2) supported by [OpenID Connect (OIDC)](https://openid.net/connect/).
## Supported features
Signicat supports an identity hub that is able to provide many different eIDs through a single OIDC integration. This allows you to easily add any eID to your application in the Auth0 tenant.
Since many different eIDs require specific configurations, the generic eID and Wallet Hub allows for the usage of scopes during the authorisation flow. You can find more information about these scopes in the documentation specific for each [identity method](/docs/eid-hub/e-ids/).
## Requirements
The first step is to make sure you have both accounts set up correctly.
Here is what you need:
- Access to the [Auth0 Dashboard](https://manage.auth0.com/#).
- Access to the [Signicat Dashboard](https://dashboard.signicat.com).
If you already have access to both Dashboards, skip to the [configuration steps](#configuration-steps) section below.
### Auth0 registration
To connect Signicat's eIDs with Auth0, you need access to the [Auth0 Dashboard](https://manage.auth0.com/#). If you don't have an Auth0 account, sign up at [Auth0.com](https://auth0.com/signup). After registration, Auth0 will provide you with an admin dashboard where you can manage your Auth0 tenant. {/*Follow the instructions on the Auth0 website to configure your Auth0 Dashboard account.*/}
### Signicat registration
This section explains how to get started with the [Signicat Dashboard](https://dashboard.signicat.com). If you already have an account with Signicat, you can skip to the [configuration steps](#configuration-steps) section below.
To integrate with Signicat services through Auth0, you need to sign up to Signicat. The Signicat Dashboard is where you manage all aspects of your Signicat subscription and configuration. You can sign up for free by following the steps in our [Get started](/docs/) guide.
:::note Sandbox and production accounts
We recommend you create a sandbox account to test our services before going live. Sandbox and production accounts must be set up separately.
:::
## Configuration steps
This section provides an overview of all the configuration steps required to connect Signicat eIDs, as Identity Providers, through your Auth0 tenant.
### Step 1. Create an OIDC client
To establish a connection between the Auth0 tenant and Signicat eIDs you need to use an authentication protocol, like OpenID Connect (OIDC). When adding Signicat as an OAuth 2.0 provider in the Auth0 tenant, you need to register a pair of OIDC client credentials (a Client ID and a Client Secret).
To create a new OIDC client, open the Signicat Dashboard and navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/) and click **Create Client**.
Below a summary and definitions of the values to fill in the form:
- **Client name**: the name of the client, shown to end-users on consent screens.
- **Primary Grant Type**: the grant type you want to use with this client. We strongly recommend **AuthorizationCode**. For further information about the different grant types, refer to the [OIDC specification](https://openid.net/specs/openid-connect-core-1_0.html#Authentication) and the [OAuth 2.0 specification](https://oauth.net/2/grant-types/).
- **Redirect URI**: the redirection URI to which the response will be sent at the end of an OIDC flow. It must be HTTPS and an absolute URI.
:::tip Redirect URI
When configuring the OIDC client, enter the redirect URI with format `https://{yourDomain}/login/callback`, where `yourDomain` is the domain of your Auth0 tenant.
:::
- **Scope**: The scopes will determine which attributes are returned as output of the OIDC flow, and the full set depends on the chosen eID. Different eIDs require different scopes and return different values. `openid` is mandatory and `profile` is necessary in most cases. Depending on the desired eID, you might need to include other scopes (such as `nin`, which gives access to national identity number for some eIDs). You can find the details for each eID in the [Identity Methods](/docs/eid-hub/e-ids/) page. For example, see the list of [scopes and claims for Norwegian BankID](/identity-methods/nbid/attributes-reference.mdx#oidc-scopes-and-claims).
:::note Note
You can see the definition of `profile` and other predefined scopes in the [OIDC specification](https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims). As for `nin`, this scope requests access to the end-user's national identification number.
:::
#### Create a client secret
After you create a client, you can add a secret associated to that client. Click **Add secret** and enter a name to generate a secret. You can view and add more secrets in the "Secrets" tab of your OIDC client.
:::warning Important
Make sure you copy and store your client secret securely. You can view your client secret only once, when you create it. If you ever lose your secret, you must create a new one.
:::
Once you have set up the Signicat client credentials for the OIDC connection, you're ready to proceed with [Step 2. Add an eID](#step-2-add-an-eid) and add Signicat's eIDs to your account.
### Step 2. Add an eID
This guide shows you how to set up [BankID (Norway)](/identity-methods/nbid/) in your Signicat account. You can always add more eIDs. Note that certain eIDs require additional configuration and sign agreements with either Signicat or the identity providers to obtain the needed access, in production.
The eIDs associated to your account will be accessible via the Auth0 tenant, once you register your Signicat OIDC client on the Auth0 Dashboard. You can find a list of supported eIDs per country [here](/docs/eid-hub/e-ids/).
#### Add BankID (Norway)
BankID is an electronic identity scheme in Norway that can be used for identity verification, authentication and electronic signing of documents.
To set up BankID:
1. Log in to the [Signicat Dashboard](https://dashboard.signicat.com/).
2. Navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
3. Click **Add new**.
4. Choose "Norwegian BankID" from the list of supported eIDs.
5. Click **Save**.
Norwegian BankID should now appear in the list of available eIDs with the status set to "Active". Learn more about BankID features and advanced configuration options in the dedicated section [here](/identity-methods/nbid/).
### Step 3. Create a custom social connection
On the Auth0 Dashboard you can add any OAuth 2.0 provider using a Custom Social Connection. The purpose of this step is to configure the Signicat OIDC client in the Auth0 tenant. The information in this section is specific to configuring a connection with Signicat. You can learn more about general configuration of Custom Social Connections in the [Auth0 documentation](https://auth0.com/docs/authenticate/identity-providers/social-identity-providers/oauth2).
#### Create a connection
To create a new Custom Social Connection, navigate to [Auth0 Dashboard > Authentication > Social](https://manage.auth0.com/#/connections/social), click **Create Connection**, scroll to the bottom of the list and click **Create Custom**.
To configure a connection, fill in the form with the following information:
- **Name**: the name of the connection. The name cannot be changed, must start and end with an alphanumeric character, and can only contain alphanumeric characters and dashes.
- **Authorization URL**: `https:///auth/open/connect/authorize`, where the `` is the domain defined in the **Dashboard** > [**Domains**](https://dashboard.signicat.com/domains) page.
- **Token URL**: URL used to exchange the received authorization code for access tokens and, if requested, ID tokens. Enter `https:///auth/open/connect/token`.
- **Scope**: the OIDC scopes to send with the authorisation request. Separate multiple scopes with spaces. You can explore more scopes for BankID in the [Scopes and claims mapping for OIDC](/identity-methods/nbid/attributes-reference.mdx#oidc-scopes-and-claims).
:::warning Important
The scopes you enter here must match the scopes you defined for the OIDC client in the Signicat Dashboard.
:::
- **Client ID**: the Client ID associated to your OIDC client.
- **Client Secret**: the client secret associated to your OIDC client.
- **Fetch User Profile Script**: Node.js script used to call a UserInfo URL with the provided access token and retrieve claims data. Learn how to write a script in the [Fetch User Profile Script section](#fetch-user-profile-script) below.
##### Fetch User Profile Script
The `UserInfo` endpoint is part of the [OpenID Connect standard (OIDC) specification](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo) and is designed to return claims about the authenticated user.
To obtain the data of the requested claims from the `UserInfo` endpoint, you can define a custom code snippet in Node.js.
Here is an example script:
:::details Expand example
```js
function(accessToken, ctx, callback) {
const profile = {};
request.get(
{
url: 'https:///auth/open/connect/userinfo',
headers: {
'Authorization': 'Bearer ' + accessToken,
}
},
(err, resp, body) => {
if (err) {
return callback(err);
}
if (resp.statusCode !== 200) {
return callback(new Error(body));
}
let bodyParsed;
try {
bodyParsed = JSON.parse(body);
} catch (jsonError) {
return callback(new Error(body));
}
const profile = {
user_id: bodyParsed.sub,
name: bodyParsed.name,
given_name: bodyParsed.given_name,
family_name: bodyParsed.family_name
};
callback(null, profile);
}
);
}
```
:::
Here are a few details:
- `url`: is the **UserInfo** URL of your Signicat domain. Substitute `` with the domain associated to your account and defined in the **Dashboard** > [**Domains**](https://dashboard.signicat.com/domains) page.
- `const profile` determines the attributes returned from the information the end-user consents to (if necessary) during authentication.
- `bodyParsed` is the parsed JSON of the response body sent from the eID. You can access attributes from the **UserInfo** response with the values in the format `bodyParsed.`, such as `bodyParsed.given_name`.
Using the above script in a test connection would return the following data:
:::details Expand example
```json
{
...
"sub": "oauth2|Signicat-connection|-BoDH7BDacLNL4ut********44m98r3NDa9uTRE=",
"family_name": "Williams",
"given_name": "Ellie",
"nickname": "",
"name": "",
"picture": "https://cdn.auth0.com/avatars/default.png",
...
}
```
:::
You can manage your users from [Auth0 Dashboard > User Management > Users](https://manage.auth0.com/#/users). This is where you can view the Raw JSON data returned by the end-user login flow.
##### Advanced Fetch User Profile Script
You can expand the profile to include more attributes. For example, you can retrieve `birthdate` and `nin` (national identity number) information by adding more fields like:
:::details Expand example
```js {7-8}
// omitted for brevity
const profile = {
user_id: bodyParsed.sub,
name: bodyParsed.given_name + ' ' + bodyParsed.family_name,
given_name: bodyParsed.given_name,
family_name: bodyParsed.family_name,
birthdate: bodyParsed.birthdate,
nin: bodyParsed.nin
};
// omitted for brevity
```
:::
In this case, the user profile data received is:
:::details Expand example
```json {4,9}
{
...
"sub": "oauth2|Signicat-connection|-BoDH7BD8fLNL4ut******44m98r3NDa9uTRE=",
"birthdate": "1908-09-29",
"family_name": "Williams",
"given_name": "Ellie",
"name": "Ellie Williams",
"nickname": "Ellie Williams",
"nin": "01100844350",
"picture": "https://cdn.auth0.com/avatars/default.png",
...
}
```
:::
You can customise the attributes of the profile returned by the identity provider. The number of attributes you can retrieve depends on a few factors, such as the identity provider, the user consent, the configuration of your Auth0 tenant, and (importantly) the scopes you configure with your OIDC client. You can explore the Signicat scopes (and corresponding claims) for Norwegian BankID in the [Scopes and claims mapping for OIDC](/identity-methods/nbid/attributes-reference.mdx#oidc-scopes-and-claims).
#### Add the Application
Once you create a custom connection, you will see the **Applications** view. Here, you can enable and disable applications for which you would like the connection to appear. If you don't have any applications in your account, please [create an Application](https://auth0.com/docs/get-started/auth0-overview/create-applications).
Click on the toggle button to enable at least one Application. For example, you can link the connection to a Single Page Application, or any other application of your choice.
You are all set! You can now test the connection and authenticate with a test user for Norwegian BankID before going live in production.
### Step 4. Test the connection
To test the configured flow, you can either add the OIDC flow to an frontend application or try the connection directly from the Auth0 tenant.
To test the OIDC flow from the Auth0 tenant, navigate to the [Auth0 Dashboard > Authentication > Social](https://manage.auth0.com/#/connections/social), click the Social Connection you created and click **Try connection** to start the user authentication flow.
Choose **Norwegian BankID** and sign in with a [test user](/identity-methods/nbid/test.mdx#test-credentials) as follows:
:::CustomTable{columnWidths="33% 33% 33%"}
| National identity number | One time password | Password |
| :----------------------- | :---------------- | :--------- |
| `01100844350` | `otp` | `qwer1234` |
:::
Here is how a user flow looks like (with BankID app):
### Step 5. Go live
To implement the flow in production, set up the Signicat OIDC client from a production account in the Signicat Dashboard. Choose a production account in the [**Organisation management**](https://dashboard.signicat.com/org-mgmt/) page in the Signicat Dashboard and repeat the steps in this guide.
:::warning Agreements required
Note that while the technical implementation steps stay the same, you must sign an agreement with Signicat to start accepting authentication from real legal persons.
To sign an agreement, log into the [Signicat Dashboard](https://dashboard.signicat.com/) and click 'Talk to sales' in the banner at the top of the page.
:::
Also, take a look at the [Auth0 pre-deployment checks](https://auth0.com/docs/deploy-monitor/pre-deployment-checks) to make sure the entire setup is ready to be launched in a production environment!
If you have any questions about the integration, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
---
## Connectors
Integrate with Signicat eID and Wallet Hub from various third-party authentication providers.
* [**Auth0**](/docs/eid-hub/connectors/auth0-integration): Integrate Signicat eID and Wallet Hub with Auth0 using OpenID Connect
---
## Demo
The eID and Wallet Hub demos allows you to explore the user experience of electronic identities (eIDs) firsthand, with no setup required. Demos are tools designed for you to explore the eID and Wallet Hub and understand the steps in a typical user journey with a specific eID.
To try out a demo with an eID, visit the eID and Wallet Hub demos at:
[**eID and Wallet Hub demos**](https://demo.signicat.com/?filters=or(product:eID-Hub,product:eID-and-Wallet-Hub))
:::tip Test credentials
Many eIDs provide test credentials for authentication. We provide test credentials in the demo.
To view more test credentials and explore other options for testing an eID, visit the specific [eID documentation](/docs/eid-hub/e-ids/index.mdx).
:::
We recommend trying out the demo when:
- You are interested in identity proofing, user authentication, and electronic signing with eIDs but don't know where to start.
- You are just getting started with Signicat eID and Wallet Hub.
- You want to familiarise yourself with an eID *before* investing your time for setup.
:::note Testing only
The demo eIDs are for testing purposes only and do not perform any real authentication.
:::
## Troubleshooting and support
If you encounter any issues with the demo site:
1. Ensure that your browser is updated to the latest version.
2. Verify that your test credentials are correct.
If the issue persists, contact the Signicat support team by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
## Next steps
When you are ready to get started with the eID and Wallet Hub, follow the steps in the [Quick start guide](/docs/eid-hub/quick-start/).
---
## Add eIDs
The first step when you integrate with the eID and Wallet Hub is to add, configure and activate an eID in your account in the Signicat Dashboard.
## Prerequisites
If you do not have an account already, then you need to sign up to the Signicat Dashboard for free and complete the initial preparations. To do this:
1. Sign up to the [Signicat Dashboard](https://login.signicat.com/ownidp/web/registration) and register your profile.
2. Ensure that you have created an [organisation](/docs/dashboard/organisation-management/organisations.mdx).
3. Create an [account](/docs/dashboard/organisation-management/accounts.mdx). To do this:
1. Go to **Signicat Dashboard** > [**Organisation**](https://dashboard.signicat.com/org-mgmt/), then select **+ Add account**.
2. Enter an account name, choose the type of account that you want to create, then select **Create**.
4. Create a [domain](/docs/dashboard/organisation-management/domains/). To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains/), then select **+ Add domain**.
2. To create a standard domain, enter a domain name. Then, select **Add domain**.
3. To create a custom domain, follow the instructions in the [Custom domains](/docs/dashboard/organisation-management/domains/custom/) documentation.
:::tip Account types
We recommend that you create a sandbox account to test our services before going live. Sandbox and production accounts must be set up separately.
:::
:::note Domains and eIDs
For the scope of this guide, you can use a standard Signicat domain.
However, note that certain eIDs may require additional security measures, such as the use of digital SSL certificates and custom domains. You can find more details in the specific documentation for the [eID](/docs/eid-hub/e-ids/).
:::
## How to add an eID
To add an eID to your Signicat account, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. Click **+ Add new** in the top right.
3. Choose the eID from the list. Then, fill in any required configuration and click **Add**.
4. Now, review that the eID is available and displayed as "Active" in the eIDs page.
:::note Additional configuration
Certain eIDs may require additional configuration or support from our onboarding team.
For more information about a particular eID, navigate to the [eID](/docs/eid-hub/e-ids/) page or contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
## Testing an eID
After you have added and configured the eID, you can run a test in the Dashboard, as explained in the [Test eIDs](/docs/eid-hub/e-ids/test-eids/) guide.
If your eID requires additional configurations, you can use the Simulator. Learn more about this feature in the [Simulator](/docs/eid-hub/e-ids/simulator/) documentation.
## Next steps
Typically, the next step in your integration is to set up a connection between your application and the eID and Wallet Hub using one of the supported authentication protocols:
* [**OpenID Connect (OIDC)**](/docs/eid-hub/oidc/): Find out more about OIDC, the authentication protocol based on the OAuth 2.0 protocol
* [**SAML 2.0**](/docs/eid-hub/saml-2-0/): Find out more about SAML, an XML-based standard for exchanging authentication and authorisation data between security domains.
* [**Authentication REST API**](/docs/eid-hub/authentication-api/): Find out more about the Signicat Authentication REST API which enables you to easily and securely authenticate your end-users.
---
## eIDs
Integrate digital identities and third-party information sources through Signicat eID and Wallet Hub. Follow the links below to read about the eID, access to get started guides, use cases, and more.
## Guides
Explore our guides to set up and test an eID.
* [**Add eIDs**](/docs/eid-hub/e-ids/add-eids): Activate an eID in the Signicat Dashboard
* [**Test eIDs**](/docs/eid-hub/e-ids/test-eids): Start testing and understand the user journey
* [**Simulator**](/docs/eid-hub/e-ids/simulator): Customise your testing environment with the simulator
---
## Simulator
The Simulator is a tool in the eID and Wallet Hub to test an authentication process without the need to add or activate any eID in your account.
The Simulator acts as an identity provider simulator to return sample responses that help you understand the user attributes that apply to a specific eID.
We recommend using the Simulator when:
- You want to test an eID *before* it becomes active in your account; for example, when you are waiting for a certificate.
- There exists no test credentials for a given eID.
- You want a flexible solution to customise the user attributes returned from authentication.
- You want to test a connection with an authentication protocol without depending on a specific eID.
:::note Notes
- The Simulator works both with and without using a connection with an authentication protocol.
- The Simulator is only available for use in a sandbox account.
:::
## How it works
The Simulator is a flexible tool that lets you test and prepare for your integration in a self-contained environment.
When using the Simulator, you mock an authentication process without connecting directly to an eID. Nonetheless, you can customise and review the user attributes that you would normally receive after a successful authentication. You don't need any test credentials or to activate any eID in your account.
When you add the Simulator to your sandbox account, it becomes available for testing like any other eID:
:::note Data quality
The Simulator provides only a limited sample of user attributes. Use it as a testing tool to support your development, rather than a definitive source of truth.
:::
## Get started
To use the Simulator, you must first add it in your Signicat account.
:::note Which eIDs does the Simulator support?
The Simulator is currently available for a portion of the eIDs in the eID and Wallet Hub.
We are in the process of adding support for more eIDs, and will eventually roll out support for all.
:::
### Prerequisites
If you do not have an account already, then you need to sign up to the Signicat Dashboard for free and complete the initial preparations. To do this:
1. Sign up to the [Signicat Dashboard](https://login.signicat.com/ownidp/web/registration) and register your profile.
2. Ensure that you have created an [organisation](/docs/dashboard/organisation-management/organisations.mdx).
3. Create an [account](/docs/dashboard/organisation-management/accounts.mdx). To do this:
1. Go to **Signicat Dashboard** > [**Organisation**](https://dashboard.signicat.com/org-mgmt/), then select **+ Add account**.
2. Enter an account name, choose the type of account that you want to create, then select **Create**.
4. Create a [domain](/docs/dashboard/organisation-management/domains/). To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains/), then select **+ Add domain**.
2. To create a standard domain, enter a domain name. Then, select **Add domain**.
3. To create a custom domain, follow the instructions in the [Custom domains](/docs/dashboard/organisation-management/domains/custom/) documentation.
:::tip Account types
We recommend that you create a sandbox account to test our services before going live. Sandbox and production accounts must be set up separately.
:::
:::note Domains and eIDs
For the scope of this guide, you can use a standard Signicat domain.
However, note that certain eIDs may require additional security measures, such as the use of digital SSL certificates and custom domains. You can find more details in the specific documentation for the [eID](/docs/eid-hub/e-ids/).
:::
### Add the Simulator
Before you can start testing, add the Simulator by following these steps:
1. In the Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. Select **+ Add new** in the top-right corner.
3. Select **Simulator** from the list of supported eIDs.
4. On the Simulator configuration page, set the following:
- **Name**: The name of the Simulator (required).
- **Include only when scoped**: If ticked, the Simulator is available for authentication only when you pass `Simulator` in the query parameter of your request. Scoping varies per authentication protocol. Learn more in the [Scoping the Simulator](#scoping-the-simulator) section (optional).
- **Select attribute filter**: Allows you to use an attribute filter (optional).
- **Response attribute mappings**: Maps attributes to keys that you define (optional).
5. Select **Add** to activate the Simulator.
Here is how the configuration page looks like:
Now, you can choose the Simulator as an eID for testing.
## Start testing
You can run tests using the Simulator in three ways:
1. [Test with eIDs](#test-with-eids)
2. [Test with custom provider](#test-with-custom-provider)
3. [Test protocol connections](#test-protocol-connections)
### Test with eIDs
Imagine a scenario where you want to implement Swedish BankID in your application. Before starting the integration, you want to test it but you don't have any credentials. Instead, you can test Swedish BankID with the Simulator, by doing this:
1. In the Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. Select **Test eIDs** in the top right.
3. Choose the **Simulator** from the list of available providers. The name of the Simulator depends on your configuration.
4. In the next step, choose **Swedish BankID**.
5. Optional. Edit the data to suit your needs. Then, select **Send** to send the request.
6. Review the user data attributes in the response.
Here is how the steps look like in the Dashboard:
### Test with custom provider
To test an authentication process without any particular eID, you can choose a custom provider.
To do this:
1. In the Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. Select **Test eIDs** in the top right.
3. Choose the **Simulator** from the list of available providers. The name of the Simulator depends on your configuration.
4. In the next step, choose **Custom**.
5. Edit the data according to your needs. Then, select **Send** to send the request.
6. Review the user data attributes in the response.
### Test protocol connections
A notable scenario to use the Simulator is when you are building the integration and want to test a connection after you set up an authentication protocol. We support [OpenID Connect (OIDC)](/docs/eid-hub/oidc/), [SAML 2.0](/docs/eid-hub/saml-2-0) and the Signicat [Authentication REST API](/docs/eid-hub/authentication-api/).
When you navigate to the authorisation URL you built with an authentication protocol, you can choose the Simulator as an identity provider in the provider selection screen.
For example, an authorisation (URL) request using OIDC might look like this:
```curl {9}
https:///auth/open/connect/authorize?
&client_id=
&response_type=
&redirect_uri=
&scope=openid%20profile
&state=
&code_challenge=ABC123
&code_challenge_method=S256
```
To skip the selection screen and route directly to the Simulator UI, you can [scope the Simulator](#scoping-the-simulator).
#### Scoping the Simulator
To bypass the selection screen with the different protocols, use the following query parameters in your authorisation request:
:::CustomTable
| Protocol | Query parameter |
|------------------------ |-----------------|
| OIDC | `acr_values=idp:simulator` |
| Authentication REST API | `"allowedProviders": ["simulator"]` |
| SAML 2.0 | `` `` `` ```` |
:::
:::note Note
Scoping also works when you enable the **Include only when scoped** setting, as explained in the [Add the Simulator](#add-the-simulator) section above.
:::
#### Scoping request examples
To automatically test the Simulator with OIDC, define `acr_values=idp:simulator` in your authorisation request:
```curl {9}
https:///auth/open/connect/authorize?
&client_id=
&response_type=
&redirect_uri=
&scope=openid%20profile
&state=
&code_challenge=ABC123
&code_challenge_method=S256
&acr_values=idp:simulator
```
To automatically test the Simulator with SAML 2.0, define `ProviderID="simulator"` in your `AuthnRequest` request:
```xml {8-12}
ENTITY_ID
```
To automatically test the Simulator with the Authentication REST API, define `allowedProviders` in the body of the [Create a new session](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint, as shown below:
```json
...
"allowedProviders": [
"simulator",
],
...
```
---
## Test an eID
You can test an authentication process with any eID directly from the Signicat Dashboard. Testing allows you to better understand the user experience with an eID and helps you prepare for the integration.
We recommend using the solution described on this page when:
- You have already added eID in your Signicat account. To learn how to add an eID, see [Add eIDs](/docs/eid-hub/e-ids/add-eids.mdx).
- You want to test an eID *before* connecting with an authentication protocol, such as OIDC, SAML 2.0 or the Signicat Authentication REST API.
- You have access to test credentials for the eID. This guide explains how to get test users.
When the scenario above doesn't meet your requirements, consider using the [Simulator](/docs/eid-hub/e-ids/simulator.mdx).
## How to test an eID in the Dashboard
:::info Before you begin
Before you begin, make sure to follow the steps to [Add eIDs](/docs/eid-hub/e-ids/add-eids.mdx) in the Dashboard.
:::
To test an authentication flow in the Dashboard, do the following:
1. In the Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. Select **Test eIDs** in the top right.
3. Optional: If you've activated more than one eIDs, choose the eID from the list of available providers.
4. Follow the steps on the provider site using your test credentials.
5. Review the user data attributes returned by the eID.
When you complete a test authentication, the test site shows you examples of responses containing the user attributes.
## Test example
To quickly run a test with an eID, add the Signicat Email OTP to your account, following the steps in the [Add eIDs](/docs/eid-hub/e-ids/add-eids.mdx) guide.
Once you have added the Email OTP method, you can test it in just a few clicks. To do this:
1. In the Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. Select **Test eIDs** in the top right.
3. Optional: Choose **Email OTP** from the list of available providers. Applies only if you have more than one eID active in your account.
4. In the Email OTP screen, enter your email address. Then, select **Next**.
5. In your email inbox, open the email from Signicat and copy the one-time password (OTP).
6. Navigate back to the Email OTP authentication tab and enter the OTP.
7. Select **Verify** to authenticate.
Here is what the user journey would look like:
## Test user credentials
Many eIDs provide test credentials that allow you to mock an authentication process. Navigate to the specific [eID](/docs/eid-hub/e-ids/index.mdx) documentation to find test information.
## Next steps
Typically, the next step in your integration is to set up a connection between your application and the eID and Wallet Hub using one of the supported authentication protocols:
* [**OIDC**](/docs/eid-hub/oidc/): Find out more about OIDC, the authentication protocol based on the OAuth 2.0 protocol
* [**SAML 2.0**](/docs/eid-hub/saml-2-0/): Find out more about SAML, an XML-based standard for exchanging authentication and authorisation data between security domains.
* [**Authentication REST API**](/docs/eid-hub/authentication-api/): Find out more about the Signicat Authentication REST API which enables you to easily and securely authenticate your end-users.
---
## EU Digital Identity Wallet
# Identity wallets
Signicat is fully committed to supporting the upcoming **EU Digital Identity Wallet** (EUDI Wallet) project.
The EUDI Wallet is a secure, voluntary mobile application that enables EU citizens, residents, and businesses to store, share, and manage digital identity credentials and documents, such as driver's licences, diplomas, and bank accounts, across all EU member states.
Our eID and Wallet Hub will seamlessly integrate with the EUDI Wallet, enabling you to leverage its services for secure and reliable identification and authentication use cases.
## How to prepare
To prepare for the arrival of the EUDI Wallet, you can already start integrating with our sandbox environments in the eID and Wallet Hub.
Using a sandbox environment in Signicat Dashboard, you can familiarise yourself with the world of digital identification by using alternative electronic identities. This helps you to prepare for supporting the EUDI Wallet, once it becomes officially available.
:::info Get started with the EUDI Wallet
To get started with the EUDI Wallet, contact us by using the form below:
[**Contact an expert**](https://www.signicat.com/contact/contact-sales)
:::
## Supported wallets
Explore introductory guides for the identity wallets supported through the eID and Wallet Hub:
---
## Yivi
Yivi is an app for digital identity that allows users in the Netherlands to store digitally signed personal properties (or attributes) from different trust issuers. Their data is stored in the Yivi app (or "wallet") from where users can then choose what attributes to disclose to others, for example when authenticating online.
Yivi gives users the power to chose which attributes to reveal. With the Yivi mobile app, users can verify themselves accordingly, depending on the service they are using. When buying a movie on a streaming service, for example, an end-user can reveal they are older than 16, without having to prove who they are.
Yivi is an digital identity wallet preparing to align with the European Digital Identity (EUDI) Wallet standards to support attribute-based credentials.
## Yivi roles
In the Yivi framework, the following roles exist:
1. **Users:** The end-users who have Yivi on their phone, containing cards with personal data. Users identify themselves with Yivi by sharing relevant data from their digital cards.
2. **Verifiers:** The organisations that want to know something about users and request that information through Yivi. Users disclose their data to verifiers.
3. **Issuers:** The organisations that issue personal or other data types to users, in the form of cards in their Yivi app. Users can then identify themselves to verifiers with the data on those cards.
The **verifier** can verify that certain attributes were given to the **user** in the past by validating the **issuer**'s digital signature. They can then confirm that the attributes have not been modified since they were previously authenticated.
## Key features
- Free and open source.
- A safe and secure method of authentication for the end-users.
- End-users choose when they share data from the data cards, and who they share it with.
- No fixed set of attributes provided. The end-user fills their Yivi wallet with verified attributes from various sources to then be enclosed to a verifier when the user gives consent.
- End-users can digitally sign documents by disclosing only selected relevant attributes about themselves.
## Yivi app
The Yivi app is a free mobile application that allows users to control the data they want to disclose when they log in, share data and prove who they are online.
The app is created by the Privacy by Design Foundation. You can download the app for free from the [Download Yivi page](https://www.yivi.app/en/download).
## External resources
* For more information about Yivi, visit [https://www.yivi.app/](https://www.yivi.app/en/).
* Yivi for developers is available at [https://www.yivi.app/en/for-developers](https://www.yivi.app/en/for-developers).
## Support
If you have questions, you can contact us by creating a support ticket in the Signicat Dashboard:
[**Create support ticket**](https://dashboard.signicat.com/contact-us/tickets/new)
---
## Signicat eID and Wallet Hub
The eID and Wallet Hub allows you to verify the identity of users who log in to your online service(s). You do this by connecting your application to identity wallets and electronic identities (eIDs), such as Norwegian BankID, FTN and MitID.
The eID and Wallet Hub gives you access to a hub of European eIDs and wallets through a single point of integration with the following authentication protocols:
- OpenID Connect (OIDC)
- Security Assertion Markup Language (SAML) 2.0
- Signicat Authentication REST API
Discover our developer guides and get started below.
## Guides
* [**Quick start guide**](/docs/eid-hub/quick-start/): Get started with the eID and Wallet Hub in minutes
* [**Demo**](/docs/eid-hub/demo/): Try out an eID in a few clicks
* [**Concepts**](/docs/eid-hub/concepts/): Learn about the core concepts of the eID and Wallet Hub
## eIDs
The eID and Wallet Hub offers a wide selection of eIDs to authenticate your end-users in most European countries. Learn more about eIDs, follow our integration guides and discover use cases:
export const IDMethodsDisplay = ['nbid', 'sbid', 'finnisheid', 'digid', 'email-otp', 'itsme', 'mitid', 'mobileid', 'sms-otp']
eidMethods.find(method => method.id === idMethod))} withoutSelect columns={3} />
[**View all eIDs**](/docs/eid-hub/e-ids)
Explore our guides to set up and test an eID.
* [**Add eIDs**](/docs/eid-hub/e-ids/add-eids): Activate an eID in the Signicat Dashboard
* [**Test eIDs**](/docs/eid-hub/e-ids/test-eids): Start testing and understand the user journey
* [**Simulator**](/docs/eid-hub/e-ids/simulator): Customise your testing environment with the simulator
## Identity wallets
The eID and Wallet Hub allows you to authenticate users and businesses with the EU Digital Identity Wallet. Learn more about identity wallets, follow our integration guides and discover use cases:
Explore how authentication with identity wallets works.
* [**Identity wallets**](/docs/eid-hub/identity-wallets): Get started with the EU Digital Identity Wallet
## Authentication protocols
To authenticate your end-users using eIDs or wallets, you need to set up a connection between your application and the eID and Wallet Hub by using an authentication protocol. Below, you find documentation specific to each protocol:
* [**OIDC**](/docs/eid-hub/oidc/): Find out more about OIDC, the authentication protocol based on the OAuth 2.0 protocol
* [**SAML 2.0**](/docs/eid-hub/saml-2-0/): Find out more about SAML, an XML-based standard for exchanging authentication and authorisation data between security domains.
* [**Authentication REST API**](/docs/eid-hub/authentication-api/): Find out more about the Signicat Authentication REST API which enables you to easily and securely authenticate your end-users.
### Advanced customisation
The eID and Wallet Hub is a flexible and dynamic product that you can customise to fit your needs. Learn more in the Advanced guides below:
* [**Events and webhooks**](/docs/dashboard/settings/events): Subscribe to events from Signicat services
* [**Account theming**](/docs/dashboard/branding/theming): Continue to configure the look and feel of your account
## Connectors
Take eIDs from the Signicat eID and Wallet Hub with you across platforms and third-party providers. Learn more in our Connectors guides:
* [**Auth0**](/docs/eid-hub/connectors/auth0-integration): Learn how to integrate Signicat with your Auth0 tenant
## Migration guides
If you are an existing customer migrating to our new platform, take a look at our migration guides:
* [**Migrating from Enterprise Authentication**](/docs/eid-hub/migration-guides/enterprise/): Migrate to our new Digital Trust Platform
* [**Migrating from Signicat Identity Broker**](/docs/eid-hub/migration-guides/signicat-identity-broker/): Migrate to our new Digital Trust Platform
---
## Changes for Finnish Trust Network (FTN)
This page describes the changes specific to Finnish Trust Network (FTN) that are required when migrating an existing OIDC integration from Signicat Enterprise to the new Signicat Digital Trust Platform (DTP).
## Overview
- FTN authentication works the same after migration.
- The end-user authentication flow does not require any changes specific to FTN.
- The main migration changes affect:
- OIDC configuration, including your endpoints and client credentials.
- Returned OIDC claims.
- Mandatory Message-Level Encryption (MLE).
- Authentication request signing.
- Identity method selection (if used).
:::warning FTN security requirements
For FTN, you must sign or send your authentication requests using [Pushed Authorization Requests (PAR)](/docs/eid-hub/oidc/advanced-security/pushed-authorization-requests-par/). Also, OIDC responses must use full [Message-Level Encryption (MLE)](/docs/eid-hub/oidc/advanced-security/receive-encrypted-signed-responses/), which requires an encryption key that needs to be configured on the OIDC client in our new platform before testing.
Without this configuration, authentication will fail and no result will be returned. To learn more, see the [Message level encryption](#message-level-encryption) section.
:::
## Claims
For an overview of the key claim changes, see the table below:
:::CustomTable{tableName="Overview of FTN claims" columnWidths="25% 25% 50%"}
| **Enterprise claim** | **New platform claim** | **Description** |
| :-- | :-- | :-- |
| `signicat.national_id` | `nin` | A different claim name, but the same value (Finnish national identity number) is returned. |
| Not returned | `nin_type` | Indicates the type of national identity number.**Example**: `PERSON`. |
| `locale` | `nin_issuing_country` | Indicates the issuing country of the national identity number.**Note**: For FTN, this is `FI`. |
| `ftn.idpId` | `ftn_idp` | A different claim name, but the same value is returned. **Note**: For an overview of the providers, see the [Provider scoping](/identity-methods/ftn/attributes-reference/#provider-scoping) section in the FTN **Attributes reference**. **Example**: `fi-nordea`. |
| `ftn.sub` | `ftn_sub` | A different claim name, but the same value is returned. |
| `ftn.hetu` | `ftn_hetu` | A different claim name, but the same value is returned (Finnish national identity number). |
| Not returned | `ftn_issuer` | Identifies the issuer used by the underlying FTN provider. |
| `sub` | `sub` | The same claim name, but a different value is returned after migration (unless Enterprise subject lookup is used). |
| Not returned | `idp_issuer` | Identifies the underlying FTN identity provider. |
:::
:::note Note
The standard claims `name`, `given_name`, `family_name`, `birthdate` and `gender` remain unchanged.
For a complete list of Finnish Trust Network (FTN) claims, see the [Attributes reference](/identity-methods/ftn/attributes-reference/) page.
:::
## Scopes
When migrating FTN, we recommend using the same set of scopes as in your current integration, while applying the mapping of the scope codes. For example, if you currently use `openid`, `profile` and `signicat.national_id`, we recommend that you replace `signicat.national_id` with `nin` thus resulting in `openid`, `profile` and `nin`. This ensures that you receive the equivalent user information.
```text title="Example: Scopes"
openid profile nin
```
:::tip Our recommendation
We recommend that you only use additional FTN scopes if your application already depends on them, such as the `ftn-extra` scope which returns `ftn_idp`, `ftn_sub`, `ftn_issuer` and `ftn_hetu`.
You should only use the `idp-id` scope if your application requires the separate `idp_id` claim.
:::
The exact claims returned depend on the requested scopes and your OIDC client configuration.
You can find an example of how an OIDC authentication response and used scopes differ between Enterprise and our new platform below:
```text title="Example: Enterprise OIDC scopes"
openid+ftn+profile+signicat.national_id
```
```json title="Example: Enterprise response"
{
"ftn.sub": "",
"sub": "",
"birthdate": "2000-02-01",
"gender": "male",
"ftn.hetu": "",
"name": "Onni Juhani Korhonen",
"signicat.national_id": "",
"locale": "FI",
"given_name": "Onni Juhani",
"ftn.idpId": "fi-nordea",
"family_name": "Korhonen"
}
```
```text title="Example: New platform scopes"
openid+ftn-extra+profile+nin
```
```json title="Example: New platform response"
{
"name": "Onni Juhani Korhonen",
"family_name": "Korhonen",
"given_name": "Onni Juhani",
"gender": "male",
"birthdate": "2000-02-01",
"nin": "",
"nin_type": "PERSON",
"nin_issuing_country": "FI",
"ftn_idp": "fi-nordea",
"ftn_sub": "",
"ftn_issuer": "https://identify.nordea.com",
"ftn_hetu": "",
"idp_issuer": "https://identify.nordea.com",
"sub": ""
}
```
## Required application changes
Update your application to read the Finnish national identity number from the new platform claim `nin`, instead of the Enterprise `signicat.national_id` claim:
```text title="Enterprise claim"
signicat.national_id
```
```text title="New platform claim"
nin
```
You also need to update your application to read FTN-specific claims using underscores (`_`) instead of full stops (`.`):
```text title="Example: Enterprise claims"
ftn.sub
ftn.hetu
ftn.idpId
```
```text title="Example: New platform claims"
ftn_sub
ftn_hetu
ftn_idp
```
If your application uses the OIDC `sub` claim as an internal user identifier, then you must verify your identifier mapping before migration.
:::note Note
The `sub` claim is still returned by our new platform, but the value may differ from the Enterprise value.
If you need to retrieve the identical `subID` value, then you can follow the [Migrating from Enterprise](/docs/eid-hub/migration-guides/enterprise/migration-guide-oidc/) documentation.
:::
## ACR values
The `acr_values` parameter is optional. You should only use it if your application pre-selects FTN or a specific FTN provider.
### Pre-select FTN
To pre-select FTN in our new platform, set `idp:ftn` in the `acr_values`.
```text title="Starting FTN authentication"
acr_values=idp:ftn
```
This routes the end-user directly to the FTN provider selection page.
### Pre-select an FTN provider
To pre-select a specific FTN provider, also specify `ftn_idp` in the `acr_values`.
```text title="Starting Nordea authentication"
acr_values=idp:ftn ftn_idp:fi-nordea
```
For available FTN providers and additional request parameters, see the [FTN OIDC integration guide](/identity-methods/ftn/integration-guide/oidc-ftn/).
## Message-level encryption
FTN requires message-level encryption (MLE). You must configure an encryption key on the OIDC client for our new platform before testing the FTN integration.
Without this configuration, FTN authentication will fail and no authentication result will be returned. Learn more about [Encrypted/signed responses from Signicat](/docs/eid-hub/oidc/advanced-security/receive-encrypted-signed-responses/).
:::info What does this mean?
Our new platform encrypts the ID token and UserInfo response using a public encryption key configured on the OIDC client. Your application must use the corresponding private key to decrypt the responses.
:::
### 1. Configure the encryption key
You can configure the encryption key in the Signicat Dashboard. To do this:
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients).
2. From the OIDC client management page, locate your OIDC client, then click the **Edit** button.
:::tip Tip
This is the OIDC client that you created when following the **Enterprise to new platform** migration **Quick start guide**, in the [Create a connection](/docs/eid-hub/migration-guides/enterprise/quick-start-guide/#3-create-a-connection) section.
:::
3. Click the **Advanced** tab, then click **Public keys**.
4. Choose either the **Import public key** or **+ Add public key** button, depending on what option you want to proceed with. Follow the corresponding steps under either [Option 1](#option-1-reuse-the-existing-enterprise-encryption-key) or [Option 2](#option-2-generate-a-new-encryption-key) below.
#### Option 1: Reuse the existing Enterprise encryption key
You can use this option if you want your application to continue using its existing private key. Only the public key is uploaded to our new platform. To do this:
1. Copy or export the public part of your Enterprise encryption key pair.
2. From the **Public keys** page in the Signicat Dashboard, click the **Import public key** button.
3. Enter a name, set the validation dates, then set **Encryption** for the **Usage** field.
4. Either paste the key in the **Data** field, or upload it using the **Upload file** button.
5. To finish, click the **Upload button**
#### Option 2: Generate a new encryption key
You can use this option if you want to rotate the encryption key during migration. To do this:
1. From the **Public keys** page in the Signicat Dashboard, click the **+ Add public key** button.
2. Enter a name, set the validation dates, then set **Encryption** for the **Usage** field.
3. To generate the key pair, click the **Create button**.
4. Copy the private key using the copy button, then securely store it.
5. Configure your application to use the new private key.
:::info Want to learn more?
For supported key formats and technical requirements, see the [Encrypted and signed responses from Signicat](/docs/eid-hub/oidc/advanced-security/receive-encrypted-signed-responses/) page.
:::
### 2. Enable encrypted responses
After adding the encryption key, you need to enable encrypted responses in the Signicat Dashboard. To do this:
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients).
2. From the OIDC client management page, locate your OIDC client, then click the **Edit** button.
:::tip Tip
This is the OIDC client that you created when following the **Enterprise to new platform** migration **Quick start guide**, in the [Create a connection](/docs/eid-hub/migration-guides/enterprise/quick-start-guide/#3-create-a-connection) section.
:::
3. Click the **Advanced** tab, then click **Security**.
4. Under the **User Info response type** section, use the dropdown menu to select **SignedAndEncrypted**.
5. Tick the **Require encrypted ID tokens** box.
6. To save the client, click the **Update** button.
Your application must then:
1. Decrypt the ID token or UserInfo response using its private key.
2. Read the signed JWT contained inside the encrypted response.
3. Validate the signed JWT as normal.
:::note Note
The encrypted response is a nested JWT. It must be decrypted before the claims can be read.
:::
## Authentication request signing
FTN requires signed authentication requests. You must use one of the following:
- A signed OIDC request object.
- Pushed Authorization Requests (PAR).
### Option 1: Signed request objects
If you use signed request objects, then you must configure the corresponding signing public key on the OIDC client for our new platform. To do this:
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients).
2. From the OIDC client management page, locate your OIDC client, then click the **Edit** button.
:::tip Tip
This is the OIDC client that you created when following the **Enterprise to new platform** migration **Quick start guide**, in the [Create a connection](/docs/eid-hub/migration-guides/enterprise/quick-start-guide/#3-create-a-connection) section.
:::
3. Click the **Advanced** tab, then click **Public keys**.
4. If you have an existing key, you can configure this with the **Edit** button. If not, then you can upload or create a new one with the **Import public key** or **+ Add public key** buttons.
5. If applicable, complete the name and validation date fields. Then, ensure that you set **Signing** for the **Usage** field.
6. Finalise editing, uploading or generating the new keys.
7. Your application must then keep the matching private key, and use it to sign each request object.
:::info Want to learn more?
To learn how to implement, see the [Encryption/signing of the request object](/docs/eid-hub/oidc/advanced-security/send-encrypted-signed-requests/) page.
:::
### Option 2: Pushed Authorization Requests (PAR)
To learn how to implement Pushed Authorization Requests (PAR), see the [Pushed Authorization Requests](/docs/eid-hub/oidc/advanced-security/pushed-authorization-requests-par/) page.
## Test before cutover
Migrating FTN authentication to our new platform has a low impact on the end-user authentication experience. However, FTN requires additional security requirements, including mandatory message-level encryption (MLE) and signed authentication requests. Note that you need to configure and implement these additional security requirements in our new platform.
Before production cutover, verify that your application can:
- Complete an FTN OIDC authentication flow in our new platform.
- Read the Finnish national identity number from `nin` instead of `signicat.national_id`.
- Read FTN-specific claims using underscore-based names (for example, `ftn_sub` and `ftn_idp`).
- Successfully decrypt encrypted OIDC responses using the configured private key.
- Send signed authentication requests or use Pushed Authorization Requests (PAR), as required.
- Handle any changes to the `sub` value if it is used as an internal identifier.
- Pre-select FTN using `acr_values=idp:ftn`, if your application uses method pre-selection.
- Pre-select the correct FTN provider, if your application uses provider pre-selection.
---
## Changes for eIDs
Learn about changes specific to the eIDs that you are using, to help ensure a smooth transition between Signicat Enterprise and the new Signicat Digital Trust Platform (DTP).
* [**Changes for Norwegian BankID**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/nbid): Learn about migration changes specific to Norwegian BankID
* [**Changes for Swedish BankID**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/sbid): Learn about migration changes specific to Swedish BankID
* [**Changes for MitID**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/mitid): Learn about migration changes specific to MitID
* [**Changes for Finnish Trust Network (FTN)**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/ftn): Learn about migration changes specific to Finnish Trust Network (FTN)
---
## Changes for MitID
This page describes the changes specific to MitID that are required when migrating an existing OIDC integration from Signicat Enterprise to the new Signicat Digital Trust Platform (DTP).
## Overview
- MitID authentication works the same after migration.
- The end-user authentication flow does not require any changes specific to MitID.
- The main migration changes affect:
- OIDC configuration, including your endpoints and client credentials.
- Returned OIDC claims.
- Requested scopes.
- ACR values (if used).
## Claims
For an overview of the key claim changes, see the table below:
:::CustomTable{tableName="Overview of MitID claims" columnWidths="25% 25% 50%"}
| **Enterprise claim** | **New platform claim** | **Description** |
| :-- | :-- | :-- |
| `signicat.national_id` or `mitid.cpr` | `nin` | A different claim name, but the same value (CPR number) is returned.**Note**: CPR matching must be enabled. |
| Not returned | `nin_type` | Indicates the type of national identity number.**Example**: `PERSON`. |
| Not returned | `nin_issuing_country` | Indicates the issuing country of the national identity number.**Note**: For MitID, this is `DK`. |
| `mitid.has_cpr` | `mitid_has_cpr` | A different claim name, but the same value is returned. |
| `mitid.transaction_id` | `mitid_transaction_id` | A different claim name, but the same value is returned. |
| `mitid.reference_text_body` | `mitid_reference_text_body` | A different claim name, but the same value is returned. |
| `mitid.cpr.source` | `mitid_cpr_source` | A different claim name, but the same value is returned. |
| Not returned | `mitid_name_and_address_protection` | This is returned when the end-user has name and address protection. **Note**: This returns either `true` or `false`. |
| `mitid.ial` or `mitid.ial_identity_assurance_level` | `mitid_ial` | A different claim name, but the same value is returned. |
| `mitid.loa` | `mitid_loa` | A different claim name, but the same value is returned. |
| `mitid.aal` | `mitid_aal` | A different claim name, but the same value is returned. |
| `mitid.fal` | `mitid_fal` | A different claim name, but the same value is returned. |
| `mitid.uuid` | `mitid_uuid` | A different claim name, but the same value is returned. |
| `mitid.identity_name` | `name` | Now returned using the standard OIDC `profile` claim. |
| `sub` | `sub` | The same claim name, but a different value is returned after migration (unless Enterprise subject lookup is used). |
| Not returned | `idp_issuer` | Identifies the underlying MitID identity provider. |
| `mitid.age` | Not returned | If your application depends on these claims, you must verify the required configuration of our new platform or update the application before production cutover. |
| `mitid.psd2` | Not returned | If your application depends on these claims, you must verify the required configuration of our new platform, or update the application before production cutover. |
:::
:::note Note
The standard claims `name`, `given_name`, `family_name`, `birthdate` and `gender` remain unchanged.
For a complete list of MitID claims, see the [Attributes reference](/identity-methods/mitid/attributes-reference/) page.
:::
## Scopes
When migrating MitID, we recommend using the same set of scopes as in your current integration, while applying the mapping of the scope codes. For example, if you currently use `openid`, `profile` and `signicat.national_id`, we recommend that you replace `signicat.national_id` with `nin` thus resulting in `openid`, `profile` and `nin`. This ensures that you receive the equivalent user information.
```text title="Example: Scopes"
openid profile nin
```
:::tip Our recommendation
We recommend that you only use additional MitID scopes if your application already depends on them, such as `mitid-extra`.
:::
The exact claims returned depend on the requested scopes, the OIDC client configuration, CPR matching, and any optional MitID functionality used by the integration. Some MitID claims are conditional and are therefore not returned in every authentication response.
:::info What does this mean?
For example, when name and address protection applies, `mitid_name_and_address_protection` may be returned and the standard name claims may be omitted.
:::
You can find an example of how an OIDC authentication response and used scopes differ between Enterprise and our new platform below:
```text title="Example: Enterprise OIDC scopes"
openid+mitid+profile+signicat.national_id+signicat.organization
```
```json title="Example: Enterprise response"
{
"sub": "",
"birthdate": "1902-12-18",
"name": "Petter Johnson",
"signicat.national_id": "",
"given_name": "Petter",
"family_name": "Johnson",
"mitid.has_cpr": "true",
"mitid.transaction_id": "41497a86-390d-4110-b4bd-ffca35aace8a",
"mitid.reference_text_body": " ",
"mitid.cpr.source": "user",
"mitid.ial": "HIGH",
"mitid.loa": "HIGH",
"mitid.aal": "HIGH",
"mitid.fal": "HIGH",
"mitid.uuid": "b3c6cddf-0b8e-4760-a38b-45afccfca30a"
}
```
```text title="Example: New platform scopes"
openid+mitid-extra+profile+nin
```
```json title="Example: New platform response"
{
"name": "Petter Johnson",
"family_name": "Johnson",
"given_name": "Petter",
"birthdate": "1902-12-18",
"nin": "",
"nin_type": "PERSON",
"nin_issuing_country": "DK",
"mitid_has_cpr": "true",
"mitid_transaction_id": "41497a86-390d-4110-b4bd-ffca35aace8a",
"mitid_reference_text_body": " ",
"mitid_cpr_source": "user",
"mitid_ial": "HIGH",
"mitid_loa": "HIGH",
"mitid_aal": "HIGH",
"mitid_fal": "HIGH",
"mitid_uuid": "b3c6cddf-0b8e-4760-a38b-45afccfca30a",
"idp_issuer": "MitID",
"sub": ""
}
```
## Required application changes
Update your application to read the CPR number from the new platform claim `nin`, instead of the Enterprise `signicat.national_id` or `mitid.cpr` claim:
```text title="Enterprise claim"
signicat.national_id
```
```text title="Enterprise claim"
mitid.cpr
```
```text title="New platform claim"
nin
```
Update your application to read claims specific to MitID using underscores (`_`) for our new platform, instead of full stops (`.`) for Enterprise:
```text title="Example: Enterprise claim with fullstop"
mitid.transaction_id
```
```text title="Example: New platform claim with underscore"
mitid_transaction_id
```
To verify that CPR matching works as expected, make sure that `nin` is one of the requested scopes in the authorisation request:
- A CPR number entered by the end-user.
- A previously cached CPR number.
If your application uses the OIDC `sub` claim as an internal user identifier, then you must verify your identifier mapping before migration.
:::note Note
The `sub` claim is still returned by our new platform, but the value may differ from the Enterprise value.
If you need to retrieve the identical `subID` value, then you can follow the [Migrating from Enterprise](/docs/eid-hub/migration-guides/enterprise/migration-guide-oidc) documentation.
:::
## ACR values
The `acr_values` parameter is optional. You should only use it if your application pre-selects MitID.
### Pre-select MitID
To pre-select MitID in our new platform, set `idp:mitid` in the `acr_values`.
```text title="Starting MitID authentication"
acr_values=idp:mitid
```
:::note Note
When MitID is the only method specified, the user is routed directly to MitID without seeing the identity method selection screen.
:::
### Additional MitID request parameters
For additional MitID request parameters, see the [MitID OIDC integration guide](/identity-methods/mitid/integration-guide/oidc-mitid/). This includes:
- Native app switching.
- Transaction reference text.
- Other MitID-specific request options.
## Test before cutover
Migrating MitID authentication to our new platform has a low overall impact. End-users authenticate in the same way, and the returned OIDC response is largely unchanged.
Before production cutover, verify that your application can:
- Complete a MitID OIDC authentication flow in our new platform.
- Read the CPR number from `nin` instead of `signicat.national_id` or `mitid.cpr`.
- Read MitID-specific claims using underscore-based names (for example, `mitid_transaction_id`).
- Handle conditional claims, including users with name and address protection.
- Handle any changes to the `sub` value if it is used as an internal identifier.
- Pre-select MitID using `acr_values=idp:mitid`, if your application uses method pre-selection.
- Verify any additional MitID functionality used by your integration.
---
## Changes for Norwegian BankID
This page describes the changes specific to Norwegian BankID that are required when migrating an existing OIDC integration from Signicat Enterprise to the new Signicat Digital Trust Platform (DTP).
## Overview
- Norwegian BankID authentication works the same after migration.
- Your end-users will experience the exact same authentication flow as before.
- The end-user flow does not require any changes specific to Norwegian BankID.
- The main migration changes affect:
- OIDC configuration, including your endpoints and client credentials.
- Returned OIDC claims, including the Norwegian national identity number.
## Claims
For an overview of the key claim changes, see the table below:
:::CustomTable{tableName="Overview of Norwegian BankID claims" columnWidths="25% 25% 50%"}
| **Enterprise claim** | **New platform claim** | **Description** |
| :-- | :-- | :-- |
| `signicat.national_id` | `nin` | A different claim name, but the same value is returned. |
| Not returned | `nin_type` | Indicates the type of national identity number. **Example**: `BIRTH`. |
| `locale` | `nin_issuing_country` | Indicates the issuing country of the national identity number. **Note**: For Norwegian BankID, this is `NO`. |
| `sub` | `sub` | The same claim name, but a different value is returned after migration (unless Enterprise subject lookup is used). |
| Not returned | `idp_issuer` | Indicates the underlying provider for Norwegian BankID. |
:::
:::note Note
The standard claims `name`, `given_name`, `family_name`, `birthdate` and `gender` remain unchanged.
For a complete list of Norwegian BankID claims, see the [Attributes reference](/identity-methods/nbid/attributes-reference/) page.
:::
## Scopes
When migrating Norwegian BankID, we recommend using the same set of scopes as in your current integration, while applying the mapping of the scope codes. For example, if you currently use `openid`, `profile` and `signicat.national_id`, we recommend that you replace `signicat.national_id` with `nin` thus resulting in `openid`, `profile` and `nin`. This ensures that you receive the equivalent user information.
```text title="Example: Scopes"
openid profile nin
```
:::tip Our recommendation
We recommend that you only use additional Norwegian BankID scopes if your application already depends on them.
:::
The exact claims returned depend on the requested scopes and your OIDC client configuration.
You can find an example of how an OIDC authentication response and the scopes used differ between Enterprise and our new platform below:
```text title="Example: Enterprise OIDC scopes"
openid+profile+signicat.national_id
```
```json title="Example: Enterprise response"
{
"sub": "",
"birthdate": "2002-12-18",
"name": "Petter Jensen Emdal",
"signicat.national_id": "",
"given_name": "Petter Jensen",
"locale": "NO",
"family_name": "Emdal"
}
```
```text title="Example: New platform scopes"
openid+profile+nin
```
```json title="Example: New platform response"
{
"name": "Petter Jensen Emdal",
"family_name": "Emdal",
"given_name": "Petter Jensen",
"birthdate": "2002-12-18",
"nin": "",
"nin_type": "BIRTH",
"nin_issuing_country": "NO",
"sub": "",
"idp_issuer": "https://auth.bankid.no/auth/realms/prod"
}
```
## Required application changes
Update your application to read the Norwegian national identity number from the new platform claim `nin`, instead of the Enterprise `signicat.national_id` claim:
```text title="Enterprise claim"
signicat.national_id
```
```text title="New platform claim"
nin
```
If your application uses the OIDC `sub` claim as an internal user identifier, then you must verify your identifier mapping before migration.
:::note Note
The `sub` claim is still returned by our new platform, but the value may differ from the Enterprise value.
If you need to retrieve the identical `subID` value, then you can follow the [Migrating from Enterprise](/docs/eid-hub/migration-guides/enterprise/migration-guide-oidc/) documentation.
:::
## ACR Values
The way in which you define the different flows of Norwegian BankID has also changed with this migration.
- Previously, you defined the flow using separate method names for level of assurance (LoA) _high_ or _substantial_ transactions.
- Now, you define the flow using ACR values.
:::note Note
The default Norwegian BankID product uses a LoA _high_ as its flow.
If you have not specifically purchased _substantial_ as an option, then you may not be able to access the _substantial_ flow.
:::
| **Name** | **Value** | **Description** |
| :-- | :-- | :-- |
| `nbid_idp` | `BID` or `BIS` | Specifies the required Norwegian BankID type, where `BID` is **BankID High** with _high_ LoA, and `BIS` is **BankID Biometric** with _substantial_ LoA. **Note**: If no value is provided, the end-user can select `BID` by default. This parameter works with `login_hint`. |
```text title="Setting Norwegian BankID flow in ACR values"
acr_values=idp:nbid nbid_idp:BIS
```
## Test before cutover
Migrating Norwegian BankID authentication to our new platform has a low overall impact. End-users authenticate in the same way, and the returned OIDC response is largely unchanged.
Before production cutover, verify that your application can:
- Complete a Norwegian BankID OIDC authentication flow in our new platform.
- Read the national identity number from `nin` instead of `signicat.national_id`.
- Read `name`, `given_name`, `family_name`, and `birthdate`.
- Handle any changes to the `sub` value if it is used as an internal identifier.
- Start the required Norwegian BankID flow using the appropriate `acr_values` (for example, `acr_values=idp:nbid nbid_idp:BIS`), if your application specifies a particular BankID type.
---
## Changes for Swedish BankID
This page describes the changes specific to Swedish BankID that are required when migrating an existing OIDC integration from Signicat Enterprise to the new Signicat Digital Trust Platform (DTP).
## Overview
- Swedish BankID authentication works the same after migration.
- The end-user authentication flow does not require any changes specific to Swedish BankID.
- The main migration changes affect:
- OIDC configuration, including your endpoints and client credentials.
- Returned OIDC claims, including the Swedish national identity number.
- Identity method selection (if used).
## Claims
For an overview of the key claim changes, see the table below:
:::CustomTable{tableName="Overview of Swedish BankID claims" columnWidths="25% 25% 50%"}
| **Enterprise claim** | **New platform claim** | **Description** |
| :-- | :-- | :-- |
| `signicat.national_id` | `nin` | A different claim name, but the same value is returned. |
| Not returned | `nin_type` | Indicates the type of national identity number. **Example**: `PERSON`. |
| `locale` | `nin_issuing_country` | Indicates the issuing country of the national identity number. **Note**: For Swedish BankID, this is `SE`. |
| `sub` | `sub` | The same claim name, but a different value is returned after migration (unless Enterprise subject lookup is used). |
| Not returned | `idp_issuer` | Indicates the underlying provider for Swedish BankID. |
:::
:::note Note
The standard claims `name`, `given_name`, `family_name`, `birthdate` and `gender` remain unchanged.
For a complete list of Swedish BankID claims, see the [Attributes reference](/identity-methods/sbid/attributes-reference/) page.
:::
## Scopes
When migrating Swedish BankID, we recommend using the same set of scopes as in your current integration, while applying the mapping of the scope codes. For example, if you currently use `openid`, `profile` and `signicat.national_id`, we recommend that you replace `signicat.national_id` with `nin` thus resulting in `openid`, `profile` and `nin`. This ensures that you receive the equivalent user information.
```text title="Example: Scopes"
openid profile nin
```
:::tip Our recommendation
We recommend that you only use additional Swedish BankID scopes if your application already depends on them.
:::
The exact claims returned depend on the requested scopes and your OIDC client configuration.
You can find an example of how an OIDC authentication response and the scopes used differ between Enterprise and our new platform below:
```text title="Example: Enterprise OIDC scopes"
openid+profile+signicat.national_id
```
```json title="Example: Enterprise response"
{
"sub": "",
"birthdate": "1976-11-19",
"name": "Marcus Johnsson",
"signicat.national_id": "",
"given_name": "Marcus",
"locale": "SV",
"family_name": "Johnsson"
}
```
```text title="Example: New platform scopes"
openid+profile+nin
```
```json title="Example: New platform response"
{
"name": "Marcus Johnsson",
"family_name": "Johnsson",
"given_name": "Marcus",
"birthdate": "1976-11-19",
"nin": "",
"nin_type": "PERSON",
"nin_issuing_country": "SE",
"sub": "",
"idp_issuer": "sbid"
}
```
## Required application changes
Update your application to read the Swedish national identity number from the new platform claim `nin`, instead of the Enterprise `signicat.national_id` claim:
```text title="Enterprise claim"
signicat.national_id
```
```text title="New platform claim"
nin
```
If your application uses the OIDC `sub` claim as an internal user identifier, then you must verify your identifier mapping before migration.
:::note Note
The `sub` claim is still returned by our new platform, but the value may differ from the Enterprise value.
If you need to retrieve the identical `subID` value, then you can follow the [Migrating from Enterprise](/docs/eid-hub/migration-guides/enterprise/migration-guide-oidc) documentation.
:::
## ACR values
The `acr_values` parameter is optional. You should only use it if your application pre-selects Swedish BankID or controls a specific Swedish BankID flow.
### Pre-select Swedish BankID and control authentication flow
To pre-select Swedish BankID in our new platform, set `idp:sbid` in the `acr_values`.
```text title="Starting default Swedish BankID flow"
acr_values=idp:sbid
```
To specify which authentication flow to use, you must also include it in the `acr_values` parameter. The examples below show how to predefine the flow to either display a QR code or launch the app on the same device.
```text title="Starting Swedish BankID QR code flow"
acr_values=idp:sbid sbid_initial_flow:REMOTE_FLOW
```
```text title="Starting Swedish BankID app launch flow"
acr_values=idp:sbid sbid_initial_flow:APP_LAUNCH
```
:::note Note
If you do not specify `sbid_initial_flow` in the `acr_values`, then the default behaviour is used and the appropriate flow is selected automatically based on the end-user's device.
:::
### Advanced Swedish BankID flows
For advanced flow options, see the [Swedish BankID OIDC integration guide](/identity-methods/sbid/integration-guide/oidc-sbid/). This includes:
- Phone flow.
- MRTD.
- Intention text.
- App redirects.
- iOS redirect behaviour.
## Test before cutover
Migrating Swedish BankID authentication to our new platform has a low overall impact. End-users authenticate in the same way, and the returned OIDC response is largely similar.
Before production cutover, verify that your application can:
- Complete a Swedish BankID OIDC authentication flow in our new platform.
- Read the national identity number from `nin` instead of `signicat.national_id`.
- Read `name`, `given_name`, `family_name`, and `birthdate`.
- Handle any changes to the `sub` value if it is used as an internal identifier.
- Pre-select Swedish BankID using `acr_values=idp:sbid`, if your application uses method pre-selection.
---
## Enterprise to new platform
In the guides below, you can learn how to migrate your integration from Signicat Enterprise to the new Signicat Digital Trust Platform (DTP).
:::note Who are these guides for?
These guides are for existing Signicat Enterprise customers who have been invited to migrate to our new Digital Trust Platform.
:::
## Before you start
Before you start, you will receive the following from Signicat so that you can begin your self-service migration:
- An invitation to your organisation on our new platform.
- Access to a sandbox account for testing.
:::tip What does sandbox mean?
On our new platform, **sandbox** refers to your pre-production environment.
:::
:::details What is self-service migration?
With self-service migration, you can configure domains, create connections and add eID methods yourself for both sandbox and production accounts.
In production, certain eID methods may require activation or configuration by Signicat before they can be used.
:::
:::details What does self-service migration look like?
For an overview of what the migration process looks like, see the steps below. Most migrations follow these steps:
1. Open your sandbox account.
2. Set up your domain.
3. Create a connection using OIDC, Authentication REST API or SAML 2.0.
4. Add the eID methods you need.
5. Update your application configuration.
6. Test the integration in sandbox.
7. Create or request your production account.
8. Notify your Migration Manager when the production account is ready.
9. Complete production setup.
10. Plan and complete production cutover.
:::
### 1. Configure your new environment using Signicat Dashboard
Learn how to set up your new environment using the Signicat Dashboard with our quick start guide.
* [**Quick start guide**](/docs/eid-hub/migration-guides/enterprise/quick-start-guide): Set up your new environment in the Signicat Dashboard
### 2. Implement changes specific to eID
Learn about changes specific to the eIDs that you are using, to help ensure a smooth transition between the old and new platform.
* [**Changes for Norwegian BankID**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/nbid): Learn about migration changes specific to Norwegian BankID
* [**Changes for Swedish BankID**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/sbid): Learn about migration changes specific to Swedish BankID
* [**Changes for MitID**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/mitid): Learn about migration changes specific to MitID
* [**Changes for Finnish Trust Network (FTN)**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/ftn): Learn about migration changes specific to Finnish Trust Network (FTN)
## Additional resources
To learn about how to do this based on the specific protocol, see the guides below.
* [**Changes for OIDC**](/docs/eid-hub/migration-guides/enterprise/migration-guide-oidc): Learn about migration changes specific to OIDC
---
## Changes for OIDC
This page applies to customers interested in migrating from Enterprise to the new Signicat Digital Trust Platform (DTP), our new platform for digital identity. Below, you can find more context to help you understand what has changed, next to suggestions for migrating in a seamless way.
For our new platform, we have built a new **OpenID Connect** server to provide consistent naming for scopes and claims, and improved configuration options.
The new server is certified by the OpenID Connect Foundation and offers more flexibility while adhering better to standards. You can read more about this in the [OIDC Server documentation](/docs/eid-hub/oidc/#signicat-oidc-server).
## Key differences
The platforms differ on the following features:
- [**Endpoints**](#endpoints): Changes to domains and paths while keeping the same endpoints.
- [**Token structure**](#token-structure): Same basic structure with differences in claims name and values.
- [**Scopes and claims**](#scopes-and-claims): Changes to National ID and IdP-specific scopes and claims.
- [**Key rotation**](#key-rotation): Keys are rotated more often.
- [**Request parameters**](#request-parameters): Changes to the format and values of certain OIDC request parameters.
- [**Subject IDs**](#subject-ids): Access Enterprise subject IDs in our new platform after migration.
- [**Finnish Trust Network (FTN) specifics**](#finnish-trust-network-ftn-specifics): Different implementation of MLE.
- [**SSO and SLO**](#sso-and-slo): Default SSO for new clients and improved SLO support.
:::note Note
While this page covers the changes that affect your OIDC integration(s) towards Signicat, note that our new platform has also changed in terms of organisation management, eIDs and platform design.
Read more about high-level concepts in the [General information](/docs/) section or find answers to common questions about OIDC in the [OIDC FAQs](/docs/eid-hub/oidc/faqs.mdx).
:::
## Endpoints
All endpoints have changed and new endpoints have been added.
You can find an overview of the endpoints in the OpenID well-known configuration endpoint.
:::CustomTable{columnWidths="50% 50%"}
| Enterprise endpoint | New platform endpoint |
| :-- | :-- |
| `https://{ENV}.signicat.com/oidc/.well-known/openid-configuration` | `https://{YOUR_SIGNICAT_DOMAIN}/auth/open/.well-known/openid-configuration` |
:::
An example OpenID well-known configuration endpoint for our new platform is [https://demo.app.signicat.com/auth/open/.well-known/openid-configuration](https://demo.app.signicat.com/auth/open/.well-known/openid-configuration).
## Token structure
The basic structure of tokens is defined by standards, and therefore token structure has not changed. However, we added, removed and updated some claims for the access and ID tokens, as displayed in the tables below:
### Access token
:::CustomTable{columnWidths="20% 20% 60%"}
| Enterprise claim | New platform claim | Comment |
| :-- | :-- | :-- |
| `iss` | `iss` | Same name, but new values. New value because domain and path structure is different in our new platform. |
| `scp` | `scope` | New name, but same value. |
| `cid` | `client_id` | New name, but same value. |
| `sub` | `sub` | Same name, but new values. Learn more in the [Subject IDs](#subject-ids) section. |
| `snm` | - | Removed field. The concept of “service” does not apply in our new platform. You can deduce the account by looking at `client_id` and `iss`. |
:::
### ID token
:::CustomTable{columnWidths="20% 20% 60%"}
| Enterprise claim | New platform claim | Comment |
| :-- | :-- | :-- |
| `iss` | `iss` | Same name, but new values. New value because domain and path structure is different in our new platform. |
| `amr` | `amr` | Same name, but new values. Our new platform has more accurate use of this field. It signifies the type of authentication for the sub-type, used for a given IdP. For example, 2FA, fingerprint, id-card. |
| `acr` | `idp` | Same name, but new values. The usage of this field has been improved. The new claim `idp_id` is now used to signify which IdP the end-user used to authenticate. |
| `sub` | `sub` | Same name, but new values. Learn more in the [Subject IDs](#subject-ids) section. |
| - | `transaction_id` | New field. An internal transaction ID for our new platform, useful when contacting Signicat support. |
| - | `sandbox` | New field. Boolean field to signify if the client belongs to a sandbox or production account. |
:::
## Scopes and claims
Standard scopes and claims have not changed, but there are some specific changes covered below.
### Claim for National ID
It is important to note that the old scope/claim `signicat.national_id` has been changed to `nin`. We updated this to avoid issues with coding libraries and to align with industry, and Signicat, standards.
We offer support for mitigation by introducing a “Custom claim alias”. To use this:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select your OIDC client. If you haven't configured a client, see [Set up an OIDC client](/docs/eid-hub/oidc/oidc-client.mdx).
3. In the menu for the OIDC client, select **Advanced > Custom claims**, then **Add custom claim**.
4. Enter `nin` in the **Claim** box and enter `signicat.national_id` in the **Alias** box.
5. Now, select **Create**.
With a “Custom claim alias”, the OIDC client will always return a `signicat.national_id` claim whenever it returns the `nin` claim. Both claims will have the same exact value.
### IdP-specific scopes and claims
Scopes and claims specific to an identity provider may be different in our new platform.
Learn more about IdP-specific scopes and claims in the [eIDs](/docs/eid-hub/e-ids/) documentation.
## Key rotation
The signing and encryption keys that belong to the new Signicat OIDC server are rotated more frequently - on a weekly basis. We changed this to improve platform security. Learn more in our [Key rotation](/docs/eid-hub/oidc/oidc-implementation.mdx#key-rotation) page.
## Request parameters
We changed the format of some OIDC request parameters. The details are below:
### ACR values
The format of `acr_value` has changed to make the parameter more flexible, consistent and easier to use. Also, many new configuration options to control ACR values in our new platform are now available.
:::warning Important
Note that the way you use ACR values to specify IdPs (eIDs) has changed.
If you use the old format, the `acr_value` will be ignored (as an unknown value) and the end-user will be presented with an IdP selection screen with all the IdPs available for that account.
:::
Refer to [`acr_values` section](/docs/eid-hub/oidc/oidc-implementation.mdx#acr_values) for more details.
### Login hint
The format for the `login_hint` parameter has changed. The available values may also have changed according to the IdP-specific definition. Learn more in the [login_hint](/docs/eid-hub/oidc/oidc-implementation.mdx#login_hint) documentation.
### Theming (Signicat profile)
Theming has changed fundamentally in our new platform. The old Enterprise URL parameter `signicat_profile` is now ignored. Learn more in the [Theming](/docs/dashboard/branding/theming.mdx#openid-connect) documentation.
### Enterprise portals
The Enterprise concept of portals for authentication to customise IdP selection screens has been deprecated in our new platform. You can mitigate this by specifying a list of IdPs in the ACR values or setting up an account with only certain IdPs enabled. Theming can also help to replicate some of the old functionality.
## Subject IDs
Our new platform introduces a new format for Subject IDs. This might affect your migration, if you are using the Enterprise Subject IDs as a primary index key or other type of unique identifier for your internal user systems. The fact that our new platform has new subject IDs for the same physical persons can be a potential blocker for your migration journey.
To mitigate this, we released a feature called “Enterprise Subject Lookups” that allows you to gain access to Enterprise subject IDs from our new platform after migration. Note that this is a temporary migration feature that will be deprecated once all customers have moved away from using old enterprise subject IDs and adopted the new platform format.
If you plan to use the “Enterprise Subject Lookups” feature, we strongly recommend that you start mapping the (old) Enterprise subject IDs to the new platform subject IDs and prefer the latter when they are available to you. Following these steps early on will save you time when the old enterprise subject IDs will get deprecated.
:::warning How to activate “Enterprise Subject Lookups”
To enable the “Enterprise Subject Lookups” feature, you need to contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
“Enterprise Subject Lookups” will be enabled only if necessary in your migration to our new platform.
:::
## Finnish Trust Network (FTN) specifics
The implementation of Message-Level Encryption (MLE) in our new platform has been improved. It is now more flexible and can be managed completely with self-service. Note that there are some differences in the implementation as explained in the [FTN specifics for OIDC section](/docs/eid-hub/oidc/oidc-implementation.mdx#finnish-trust-network-ftn-specifics) and in the [FTN documentation](/identity-methods/ftn/).
## SSO and SLO
When you create a new OIDC client in our new platform, it will have Single sign-on (SSO) by default. Learn more in the [SSO](/docs/eid-hub/oidc/oidc-implementation.mdx#single-sign-on-sso) documentation.
To reproduce the old Enterprise way without SSO, you can specify the URL parameter `prompt=login` in each authorisation request in our new platform. This prompts the end-user to authenticate each time.
Our new platform also has better support for Single log-out (SLO). Learn more in the [SLO](/docs/eid-hub/oidc/oidc-implementation.mdx#single-log-out-slo) documentation.
## Next steps
* [**Quick start guide**](/docs/eid-hub/quick-start/): Get started with the eID and Wallet Hub in minutes
* [**OpenID Connect**](/docs/eid-hub/oidc/): Find out more about OIDC, the authentication protocol based on the OAuth 2.0 protocol
---
## Quick start for migrating from Enterprise to our new platform
# Quick start guide
Learn how to migrate your integration from Signicat Enterprise to the new Signicat Digital Trust Platform (DTP), using the Signicat Dashboard.
In this guide, you will learn how to:
- Set up your new environment in the Signicat Dashboard.
- Test your integration in sandbox
- Prepare for production cutover.
:::note Documentation scope
The scope of this page covers the migration journey and how to get set up in the Signicat Dashboard.
For integration changes specific to a particular protocol, see the relevant migration guides linked at the bottom of this page.
:::
## 1. Open your sandbox account
You need to accept your invitation to the Signicat Dashboard and open your sandbox account. To do this:
1. Locate and open the Signicat Dashboard invitation email that we sent you.
2. Click the link in the email to accept the invitation.
3. In the [Signicat Dashboard](https://dashboard.signicat.com/), ensure that the sandbox account created for your migration is selected in the top navigation bar. If not, expand the dropdown menu, then select the sandbox account.
:::note Note
The sandbox account is what you will use to configure and test your new integration before making any production changes.
:::
## 2. Set up your domain
You need to set up a domain for your account. This can be either a **standard domain** or a **custom domain**, as summarised in the table below.
:::details What is a domain used for?
A domain is a pointer to the Signicat operational environment that determines the URL at which Signicat products and metadata are available.
Standard and custom domains offer the same technical capabilities; the choice between them is only a matter of preference.
To learn more, see our [Domains](/docs/dashboard/organisation-management/domains/) documentation.
:::
:::CustomTable{columnWidths="20% 40% 40%"}
| **Domain type** | **Description** | **Example** |
| :-- | :-- | :-- |
| Standard domain| A Signicat-managed domain. This is normally the simplest option. |`your-company.sandbox.signicat.com` |
| Custom domain | A domain owned by your organisation. DNS validation is required, and you can optionally provide your own certificate. | `login-sandbox.example.com` |
:::
:::note Choose your domain type
- To set up a standard domain, see the steps in the [Standard domain](#standard-domain) section below.
- To set up a custom domain, see our [Custom domain](/docs/dashboard/organisation-management/domains/custom/) documentation (outside of this guide).
:::
### Standard domain
You can set up a standard domain for your account in the Signicat Dashboard. To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains).
2. Click the **+ Add domain** button.
3. In the **Choose your domain type** dialogue box, click the **Standard domain** button. This takes you to the **Add standard domain** page.
4. In the **Domain name** field, enter your desired domain name, then click the **Add domain** button.
5. Optionally, you can set this as your default domain by clicking the **Set as default** button.
6. From the domain overview, ensure that your domain is marked with DNS status **Ready**.
:::warning Important
Remember to update your application's code and configuration to point to the standard domain address that you have created.
:::
## 3. Create a connection
You need to create a connection using an authentication protocol. This can be either **OIDC**, **Authentication REST API** or **SAML 2.0**, as summarised in the table below.
:::details What is an authentication protocol used for?
An authentication protocol is used to set up a connection between your application and the eID and Wallet Hub, allowing you to authenticate your end-users using eIDs or wallets.
When integrating with our new platform, we recommend using OIDC (OpenID Connect) or our REST-based Authentication API. If you currently use SAML, we recommend migrating to one of these authentication protocols moving forward.
:::
:::CustomTable{columnWidths="30% 70%"}
| **Authentication protocol** | **Description** |
| :-- | :-- |
| [OpenID Connect (OIDC)](/docs/eid-hub/oidc/) | You can use this for browser-based authentication and standard OIDC integrations. |
| [Authentication REST API](/docs/eid-hub/authentication-api/) | You can use this for API-driven authentication flows. |
| [SAML 2.0](/docs/eid-hub/saml-2-0/) | You can use this for existing SAML integrations that are not moving to OIDC or Authentication REST API. |
:::
:::note Choose your authentication protocol
- To set up a connection using the OIDC authentication protocol, see the steps in the [OpenID Connect (OIDC)](#openid-connect-oidc) section below.
- To set up a connection using the Authentication REST API authentication protocol, see our [Authentication REST API](/docs/eid-hub/authentication-api/) documentation (outside of this guide)
- To set up a connection using the SAML 2.0 authentication protocol, see our [SAML 2.0](/docs/eid-hub/saml-2-0/) documentation (outside of this guide)
:::
### OpenID Connect (OIDC)
You can set up a connection using the OIDC authentication protocol in the Signicat Dashboard. To do this:
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub**, then select [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/) from the left-side menu.
2. Click the **+ Create client** button.
3. Complete the fields as shown in the table below:
| **Field** | **Description** |
| :-- | :-- |
| Primary grant type | Select **Authorization code flow**, unless your integration requires another type of flow. |
| Create client from template | You do not need to update this field. **No template** can remain selected. |
| Client name | Enter a name for your client. This is shown to end-users on consent screens, and may appear in other places as well. |
| Redirect URI | Add the redirect URI for your application. This is where your end-user will be redirected after authentication, and so it must exactly match the URI used by your application. **Note**: This must be HTTPS and an absolute URI. You can add more URIs once the client is created. |
| Scope | Select the required scopes that you want to add from the dropdown menu. The `openid` scope is mandatory. **Example**: For example, you could add `nin` and `profile`. |
:::tip Tip
The scope `nin` is equivalent to the scope `signicat.national_id` on our enterprise platform.
:::
4. Click the **Create** button.
5. Click the **Add secret** to create one. This takes you to the **Secrets** tab on the client details page.
6. Select **+ Add secret** to create a secret.
7. Enter a name for the client secret, then select **Generate secret**.
8. Copy and store both the client ID and the client secret securely. This is the only time that you can view the client secret in clear text.
:::warning Important
You should never include a client secret in frontend code or an authorisation request.
:::
:::info Want to learn more?
To learn how to make additional client configurations, see our [OpenID Connect](/docs/eid-hub/oidc/) documentation.
:::
## 4. Add eID methods
You need to add eID methods for your integration. To do this:
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub**, then select [**eIDs**](https://dashboard.signicat.com/bca/authn) from the left-side menu.
2. Click the **+ Add new** button.
3. From the list of eIDs, click an eID that you would like to add, then click the **Add** button.
4. From the eID overview, ensure that the eID is marked with status **Active**.
5. Repeat steps 1-4 until you have added all the eIDs that you want for your integration.
6. From the eID overview, you can optionally click the **Test eIDs** button to test an eID before connecting your application.
:::note Production configuration
For production, some eIDs may require additional configuration by Signicat. This is explained in the [Create and configure production](#7-create-and-configure-production) section in this guide.
:::
## 5. Update your application
Update your application to use our new platform. Typical changes include:
- Domain
- Endpoints
- Client credentials
- Scopes
- Claims
- eID-selection parameters
:::note Note
The updates highlighted below show the key changes that you need to make if you are using the OIDC authentication protocol. The exact changes depend on your account configuration.
For method-specific and protocol-specific changes, see the [Related documentation](#related-documentation) section at the bottom of this page.
:::
### OpenID Connect (OIDC)
If you are using the OIDC authentication protocol, then you need to make the following key changes:
:::CustomTable{tableName="Application updates" columnWidths="20% 50% 30%"}
| **Aspect** | **What to do** | **Example** |
| :-- | :-- | :-- |
| Domain | Use your domain for our new platform that you configured in **Step 2**. **Note**: See section [2. Set up your domain](#2-set-up-your-domain). | `https://your-company.sandbox.signicat.com` |
| Endpoints | Use the endpoints for our new platform. **Note**: See section [Endpoints](#endpoints). | `/auth/open/connect/authorize` |
| Client credentials | Use your client credentials for our new platform that you configured in **Step 3**. **Note**: See section [3. Create a connection](#3-create-a-connection). | `sandbox-round-apple-123` |
| Scopes | Use the desired scopes for our new platform, as described in the method-specific migration documentation. Scopes can be subject to change for each eID. **Note**: See section [Related documentation](#next-steps). | `profile`, `nin` |
| Claims | Use the desired claims for our new platform, as described in the method-specific migration documentation. **Note**: See section [Next steps](#next-steps). Claims can be subject to change for each eID. | `name`, `given_name`, `family_name`, `birthdate`, `nin` |
| eID-selection parameters | Use the ACR values for our new platform as described in the method-specific migration documentation. | You now use the ACR values to determine the flow for the eID, such as the level of assurance for Norwegian BankID. |
:::note Clients using PKCE
If your client uses PKCE, you must also include the following:
- `code_challenge`
- `code_challenge_method=S256`
:::
#### Endpoints
You can find an overview of the main OIDC endpoint changes between Enterprise and our new platform below:
:::tip Tip
Where possible, configure your OIDC library using the discovery URL for our new platform, instead of hardcoding the individual endpoints.
:::
```text title="Discovery endpoint for Enterprise"
https://preprod.signicat.com/oidc/.well-known/openid-configuration
```
```text title="Authorization endpoint for Enterprise"
https://preprod.signicat.com/oidc/authorize
```
```text title="Token endpoint for Enterprise"
https://preprod.signicat.com/oidc/token
```
```text title="UserInfo endpoint for Enterprise"
https://preprod.signicat.com/oidc/userinfo
```
```text title="Discovery endpoint for new platform"
https:///auth/open/.well-known/openid-configuration
```
```text title="Authorization endpoint for new platform"
https:///auth/open/connect/authorize
```
```text title="Token endpoint for new platform"
https:///auth/open/connect/token
```
```text title="UserInfo endpoint for new platform"
https:///auth/open/connect/userinfo
```
#### Request examples
You can find an example of how an OIDC authentication request differs between Enterprise and our new platform below:
```text title="Example: Enterprise OIDC authentication request"
https://preprod.signicat.com/oidc/authorize
?client_id=
&response_type=code
&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback
&scope=openid%20profile%20signicat.national_id
&acr_values=urn%3Asignicat%3Aoidc%3Amethod%3Anbid
&state=
&nonce=
```
```text title="Example: New platform OIDC authentication request"
https:///auth/open/connect/authorize
?client_id=
&response_type=code
&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback
&scope=openid%20profile%20nin
&acr_values=idp%3Anbid
&state=
&nonce=
```
:::details How to find the scoping code
You can see the scoping code for your eIDs at **Signicat Dashboard** > **Products** > **eID and Wallet Hub**, > [**eIDs**](https://dashboard.signicat.com/bca/authn). For a full list of codes, visit the [eID scoping codes](/docs/eid-hub/concepts/idp-scoping/#eid-scoping-codes) table.
:::
## 6. Test in sandbox
You need to test the complete authentication flow from your application in sandbox. To do this, you must confirm that:
- The application starts authentication through the domain for new platform.
- The end-user is routed to the correct eID method.
- Authentication completes successfully.
- The end-user returns to the correct redirect URI.
- The application exchanges the Authorization code successfully.
- The expected claims are returned.
- The application can read `nin` where it would previously parse `signicat.national_id` .
- Cancellation and failed authentication are handled correctly.
:::warning Important
For sandbox, you should only use test identities and test data.
:::
## 7. Create and configure production
After sandbox testing is complete, you can create and configure the production account.
:::tip Tip
Production follows the same configuration process as in the sandbox account. However, all domains, credentials, endpoints and eID configurations are production-specific and must be configured accordingly.
:::
1. Open or create your production account in the [Signicat Dashboard](https://dashboard.signicat.com).
- If you already have one, then you need to select it from the dropdown menu in the top navigation bar.
- If you do not have one, then you need to create one using the steps below.
:::details How to create a production account
To create a production account, follow the steps below:
1. Go to **Signicat Dashboard** > [**Organisation**](https://dashboard.signicat.com/org-mgmt).
2. Click the **+ Add account** button.
3. In the **Organisation** field, ensure that the correct organisation is shown.
4. In the **Account name** field, enter a name for your production account.
5. Select the **Production account** option.
6. Click the **Create** button.
**Note**: If the production account option is unavailable, then you need to complete your company's contact information.
To do this, click the **Complete information** link, then add the following key contacts:
- Commercial owner
- Main technical contact
- Financial contact
:::
2. Once the production account is available, repeat steps 2-5 of this guide, but using production-specific values instead:
- Configure a standard or custom production domain.
- Create the same connection type used in sandbox.
- Configure the production redirect URIs, scopes, and other required settings.
- Generate and securely store the new production credentials.
- Request that your Migration Manager configures the production eIDs.
- Update the application with the production configuration.
:::note Production domain suffix
A standard production domain uses the `.app.signicat.com` suffix instead of `.sandbox.signicat.com`.
:::
## 8. Complete production testing and cutover
After your Migration Manager confirms that the production eIDs are ready, you need to do the following:
1. Update your application with the production configuration for our new platform.
2. Run a controlled production authentication test.
3. Verify the redirect and returned claims.
### Cutover checklist
Before switching all traffic, ensure that:
- The production connection is configured.
- The required eIDs are configured and verified by your Migration Manager.
- Production testing has passed.
- A rollback plan is available.
:::warning Important
Keep the Enterprise configuration available until the production integration for our new platform has been confirmed as stable.
:::
## Common issues
For a list of common issues and potential fixes, see the table below:
| **Issue** | **What to check** |
| :-- | :-- |
| An eID works in sandbox but not in production | Ask your migration manager whether production activation, certificates, or additional configuration are still required. |
| The end-user sees an eID-selection screen instead of going directly to the eID landing page. | Verify the ACR values for our new platform. **Example**: `acr_values=idp:nbid`. |
| The national identity number is missing. | Confirm that the required scope is requested, and that the application reads `nin`. |
| Authentication fails with the new client. | Check that the application is not mixing sandbox and production domains, client IDs, secrets, or endpoints. |
## Next steps
To learn about changes specific to the eIDs that you are using, make a selection using the buttons below:
* [**Changes for Norwegian BankID**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/nbid): Learn about migration changes specific to Norwegian BankID
* [**Changes for Swedish BankID**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/sbid): Learn about migration changes specific to Swedish BankID
* [**Changes for MitID**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/mitid): Learn about migration changes specific to MitID
* [**Changes for Finnish Trust Network (FTN)**](/docs/eid-hub/migration-guides/enterprise/changes-for-eids/ftn): Learn about migration changes specific to Finnish Trust Network (FTN)
## Related documentation
To learn about related topics, make a selection using the buttons below:
### Signicat Dashboard
* [**Signicat Dashboard documentation**](/docs/): Learn about the Signicat Dashboard
* [**Domains**](/docs/dashboard/organisation-management/domains/): Learn how to add and manage standard Signicat domains and custom domains
* [**Company registration**](/docs/dashboard/organisation-management/company-registration/): Learn how to complete the company registration process
### Protocol-specific information
* [**Changes for OIDC**](/docs/eid-hub/migration-guides/enterprise/migration-guide-oidc/): Learn about migration changes specific to OIDC
* [**OIDC**](/docs/eid-hub/oidc/): Learn about the OIDC authentication protocol
* [**Authentication REST API**](/docs/eid-hub/authentication-api/): Learn about the Signicat Authentication REST API authentication protocol
* [**SAML 2.0**](/docs/eid-hub/saml-2-0/): Learn about the SAML 2.0 authentication protocol
---
## Migration guides
Our migration guides provide you with step-by-step instructions for migrating your existing integrations to our new Signicat Digital Trust Platform (DTP).
They also highlight the key differences between the old and new platforms, to help ensure a smooth transition.
To get started, choose your current integration type using the buttons below:
* [**Migrate from Enterprise to DTP**](/docs/eid-hub/migration-guides/enterprise/): Learn how to migrate from Signicat Enterprise to our Digital Trust Platform (DTP)
* [**Migrate from Identity Broker to DTP**](/docs/eid-hub/migration-guides/signicat-identity-broker/): Learn how to migrate from Signicat Identity Broker to our Digital Trust Platform (DTP)
---
## Identity Broker to Digital Trust Platform (DTP)
If you are a new customer or have recently migrated to our new platform, you can now use our existing Signicat Identity Broker solutions on our new Digital Trust Platform (DTP).
:::tip Our recommendation
For an introduction to the differences between the two platforms, we recommend that you start by reading our [Migrating to the new platform](https://developer.signicat.com/broker/signicat-identity-broker/migration-guide.html) guide.
:::
* [**OpenID Connect migration guide**](/docs/eid-hub/migration-guides/signicat-identity-broker/migration-guide-oidc): Migrate from Signicat Identity Broker to our new Digital Trust Platform
* [**SAML 2.0 migration guide**](/docs/eid-hub/migration-guides/signicat-identity-broker/migration-guide-saml): Migrate from Signicat Identity Broker to our new Digital Trust Platform
---
## OpenID Connect migration guide
As the world of digital identity is constantly evolving, we wanted to provide an even better experience for our customers using the Signicat Identity Broker. That's why we built our new Digital Trust Platform.
The new platform is designed to simplify how you integrate and how you can use other Signicat products, while providing secure, reliable and developer-friendly services to meet your digital identity goals.
On this page, you can find information about the differences between the two platforms when implementing OpenID Connect (OIDC) connections. In the new platform, you can create and setup connections similarly to how you used to but a few aspects have changed. Learn more about these upgrades below.
:::info Migrating from Signicat Identity Broker: An introduction
For an introduction to the differences between the two platforms, we recommend you start with our [Migrating to the new platform](https://developer.signicat.com/broker/signicat-identity-broker/migration-guide.html) guide.
:::
## How it works
In the new platform, referred to as the Signicat Dashboard, you can manage end-user login and authentication through the **eID and Wallet Hub**. This product gives you access to a hub of European eIDs through a single point of integration which supports a range of authentication protocols, such as SAML 2.0 and OIDC.
:::tip Getting started
After the migration, you might want to discover how the new Signicat Dashboard works. To get started, consider the following guides:
- [Introduction to the Signicat Dashboard](/docs/dashboard/)
- [Quick start guide for the eID and Wallet Hub](/docs/eid-hub/quick-start/index.mdx)
- [How to set up new OIDC connections](/docs/eid-hub/oidc/oidc-client/)
:::
### Migrating to the eID and Wallet Hub
When you migrate from the Signicat Identity Broker to the eID and Wallet Hub, all your existing connections have already been automatically migrated and are ready to use. We refer to these connections as **legacy connections**.
:::info Where can I find legacy connections?
To manage your previous OIDC connections that have been migrated to the Signicat Dashboard, go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > **Legacy** > [**Legacy connections**](https://dashboard.signicat.com/bca/oidc).
:::
Note that you can also create new OIDC connections in the new Signicat Dashboard. The difference between new and legacy connections is that legacy connections still support legacy options to provide you with an environment similar to the Signicat Identity Broker.
## What's changed
:::note Documentation coming soon
If you want to migrate to the new platform, contact us for more information and technical documentation:
[**Contact an expert**](https://www.signicat.com/contact/contact-sales)
:::
---
## SAML 2.0 migration guide
As the world of digital identity is constantly evolving, we wanted to provide an even better experience for our customers using the Signicat Identity Broker. That's why we built our new Digital Trust Platform.
The new platform is designed to simplify how you integrate and how you can use other Signicat products, while providing secure, reliable and developer-friendly services to meet your digital identity goals.
On this page, you can find information about the differences between the two platforms when implementing SAML 2.0 connections. In the new platform, you can create and setup connections similarly to how you used to but a few aspects have changed. Learn more about these upgrades below.
:::info Migrating from Signicat Identity Broker: An introduction
For an introduction to the differences between the two platforms, we recommend you start with our [Migrating to the new platform](https://developer.signicat.com/broker/signicat-identity-broker/migration-guide.html) guide.
:::
## How it works
In the new platform, referred to as the Signicat Dashboard, you can manage end-user login and authentication through the **eID and Wallet Hub**. This product gives you access to a hub of European eIDs through a single point of integration which supports a range of authentication protocols, such as SAML 2.0 and OIDC.
:::tip Getting started
After the migration, you might want to discover how the new Signicat Dashboard works. To get started, consider the following guides:
- [Introduction to the Signicat Dashboard](/docs/dashboard/)
- [Quick start guide for the eID and Wallet Hub](/docs/eid-hub/quick-start/index.mdx)
- [How to set up new SAML 2.0 connections](/docs/eid-hub/saml-2-0/saml-metadata.mdx)
:::
### Migrating to the eID and Wallet Hub
When you migrate from the Signicat Identity Broker to the eID and Wallet Hub, all your existing connections have already been automatically migrated and are ready to use. We refer to these connections as **legacy connections**.
:::info Where can I find legacy connections?
To manage your previous SAML 2.0 connections that have been migrated to the Signicat Dashboard, go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > **Legacy** > [**Legacy connections**](https://dashboard.signicat.com/bca/oidc).
:::
Note that you can also create new SAML 2.0 connections in the new Signicat Dashboard. The difference between new and legacy connections is that legacy connections still support legacy options to provide you with an environment similar to the Signicat Identity Broker. You can learn more about these changes in the next section below.
## What's changed
When implementing a connection with SAML 2.0 in the new platform, note that the following properties have changed:
- [SAML Metadata](#saml-metadata)
- [Subject and NameID](#subject-and-nameid)
- [Attribute naming](#attribute-naming)
You can find more information about these changes below.
### SAML Metadata
We have changed two feature of the SAML Metadata, namely:
- The Metadata URL
- The `IDPSSODescriptor` endpoints
#### New Metadata URL
Our new platform introduces a new Metadata URL path:
:::CustomTable
| Property | Old Metadata URL endpoint | New Metadata URL endpoint |
| :------------|:----------------------------------------------|:--------------|
| Metadata URL | `https://*YOUR_SIGNICAT_DOMAIN*/broker/sp/saml/metadata`| `https://*YOUR_SIGNICAT_DOMAIN*/auth/saml/metadata` |
| Path | `/broker/sp/saml/metadata` | `/auth/saml/metadata` |
:::
:::info Updating the Metadata URL
You can still use the old metadata URL in the early stages of migration. This is fully supported. However, we recommend you update your applications to use the new Metadata URL.
:::
#### IDPSSODescriptor
The new Metadata URL endpoint affects the endpoints in the `Location` attribute of the `IDPSSODescriptor` object:
```xml title="Example: Metadata New Platform eID and Wallet Hub"
```
```xml title="Example: Metadata Signicat Identity Broker"
```
### Subject and NameID
:::tip Subject attribute
You can learn more about the subject in the [Concepts > Subject](/docs/eid-hub/concepts/subject/) page.
:::
In the Signicat Identity Broker, you used to receive the subject attribute through `NameID` according to SAML 2.0 specifications. This attribute contained the raw/unhashed subject by default.
In the new Signicat eID and Wallet Hub, this has changed so that `NameID` returns the **hashed** subject in the SAML response instead. In your legacy connection you can revert this and receive the raw/unhashed subject instead.
You can view examples of how this has changed, below:
When end-users authenticated with DigiD in the Signicat Identity Broker, you used to receive the raw subject (for example, the BSN `900026236`) in the response:
```xml {4} title="Before: DigiD reponse example in the Signicat Identity Broker"
900026236
```
After migrating to the Signicat eID and Wallet Hub, `NameID` provides the **hashed** subject:
```xml {4} title="After: DigiD reponse example in the Signicat eID and Wallet Hub"
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
```
To learn more about the data you can obtain with DigiD, see the DigiD [Attributes reference](/identity-methods/digid/attribute-reference/).
When end-users authenticated with eHerkenning in the Signicat Identity Broker, you used to receive the raw subject in the response:
```xml {5} title="Before: eHerkenning reponse example in the Signicat Identity Broker"
ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890@ABCDEF1234567890ABCDEF1234567890
```
After migrating to the Signicat eID and Wallet Hub, `NameID` provides the **hashed** subject:
```xml {5} title="After: eHerkenning reponse example in the Signicat eID and Wallet Hub"
k5QDBPNavooSgsxQNCITxSnQc5oo37cqev726-Iz1-Y=
```
To learn more about what values eHerkenning returns as subject, see the `idpId` description in the eHerkenning [Attribute glossary](/identity-methods/eherkenning/attributes-reference/glossary/#idpid).
When end-users authenticated with iDIN in the Signicat Identity Broker, you used to receive the raw subject, the [Bank Identification Number (BIN)](/identity-methods/idin/attributes-reference/#bank-identification-number-bin), in the response:
```xml {5} title="Before: iDIN reponse example in the Signicat Identity Broker"
NLRABOtestdata8de3695d048d9da76b7c09d5a800b51897441e8ae3210731a058e
```
After migrating to the Signicat eID and Wallet Hub, `NameID` provides the **hashed** subject:
```xml {5} title="After: iDIN reponse example in the Signicat eID and Wallet Hub"
Cf-jk2TjFLNaZ2rEMDjuz6YUecBKQrfCJbHgNPPQBnI=
```
To learn more about the data you can obtain with iDIN, see the iDIN [Attributes reference](/identity-methods/idin/attributes-reference/).
#### How to receive the raw subject
If you prefer to still receive the raw/unhashed subject after the migration, you can choose to either:
- Configure the raw subject for `NameID`
- Request `idpId`
Find out more about each option below.
##### Configure the raw subject for NameID
:::note Only for legacy connections
Note that you can configure the unhashed subject through `NameID` *only* for legacy connections, which have been migrated from the Signicat Identity Broker to the eID and Wallet Hub. This option is not available for new connections.
:::
To configure your SAML 2.0 legacy connection to still return the unhashed subject through `NameID`, do the following:
1. Log in to the [Signicat Dashboard](https://dashboard.signicat.com/).
2. Navigate to **Products** > **eID and Wallet Hub** > **Legacy** > [**Legacy connections**](https://dashboard.signicat.com/bca/oidc).
3. Select the SAML 2.0 legacy connection you intend to edit.
4. In the connection page, navigate to the **Advanced** tab.
5. In the Advanced tab, tick `Send unhashed subject in the response`.
6. Click **Save** at the bottom to save the changes.
:::note Option not available
If the `Send unhashed subject in the response` checkbox is not available in your SAML 2.0 legacy connection configuration in the Signicat Dashboard, contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
##### Request idpId
To receive the raw/unhashed subject in the response, you can request it as an additional attribute by specifying the `idpId` field in the `RequestedAttribute` element of your SAML authentication request. For more details, see the [SAML Request Attributes](/docs/eid-hub/saml-2-0/saml-requested-attributes/) guide.
When requesting the `idpId` field, you receive the unhashed subject in the `AttributeStatement` element in the response. This applies for both legacy and new SAML 2.0 connections.
```xml {4,11} title="DigiD reponse example in the eID and Wallet Hub with idpId"
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
...
900026236
```
:::tip Alternative: Request the `nin`
With DigiD you can receive the raw subject (BSN) also when requesting the `nin` attribute. Learn more about the data you can obtain with DigiD in the [Attributes reference](/identity-methods/digid/attribute-reference/).
:::
```xml {5,12} title="eHerkenning reponse example in the eID and Wallet Hub with idpId"
k5QDBPNavooSgsxQNCITxSnQc5oo37cqev726-Iz1-Y=
...
ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890@ABCDEF1234567890ABCDEF1234567890
```
```xml {5,12} title="iDIN reponse example in the eID and Wallet Hub with idpId"
Cf-jk2TjFLNaZ2rEMDjuz6YUecBKQrfCJbHgNPPQBnI=
...
NLRABOtestdata8de3695d048d9da76b7c09d5a800b51897441e8ae3210731a058e
```
### Attribute naming
The new platform introduces new naming for all the attributes. The new names are shorter, more intuitive and ensure consistency across eIDs. This means that you need to update how you define personal data fields in your authentication request.
#### Attribute name changes
Expand the sections below to reveal the respective table for each eID:
:::details iDIN attribute name changes (Click to expand)
:::CustomTable
| Legacy Attribute Name | New Attribute Name |
| --- | --- |
| `urn:nl:bvn:bankid:1.0:consumer.18orolder` | `18OrOlder` |
| `urn:nl:bvn:bankid:1.0:consumer.bin` | `bin` |
| `urn:nl:bvn:bankid:1.0:consumer.city` | `address.city` |
| `urn:nl:bvn:bankid:1.0:consumer.country` | `address.country` |
| `urn:nl:bvn:bankid:1.0:consumer.dateofbirth` | `dateOfBirth` |
| `urn:nl:bvn:bankid:1.0:consumer.email` | `email` |
| `urn:nl:bvn:bankid:1.0:consumer.gender` | `gender` |
| `urn:nl:bvn:bankid:1.0:consumer.houseno` | `address.houseNumber` |
| `urn:nl:bvn:bankid:1.0:consumer.housenosuf` | `address.houseNumber AND address.houseNumberSuffix` |
| `urn:nl:bvn:bankid:1.0:consumer.initials` | `initials AND name.firstName` |
| `urn:nl:bvn:bankid:1.0:consumer.legallastname` | `legalLastName` |
| `urn:nl:bvn:bankid:1.0:consumer.legallastname` | `name.lastName` |
| `urn:nl:bvn:bankid:1.0:consumer.legallastnameprefix` | `legalLastNamePrefix` |
| `urn:nl:bvn:bankid:1.0:consumer.partnerlastname` | `partnerLastName` |
| `urn:nl:bvn:bankid:1.0:consumer.partnerlastnameprefix` | `partnerLastNamePrefix` |
| `urn:nl:bvn:bankid:1.0:consumer.postalcode` | `address.postalCode` |
| `urn:nl:bvn:bankid:1.0:consumer.preferredlastname` | `preferredLastName` |
| `urn:nl:bvn:bankid:1.0:consumer.preferredlastnameprefix` | `preferredLastNamePrefix` |
| `urn:nl:bvn:bankid:1.0:consumer.street` | `address.street` |
| `urn:nl:bvn:bankid:1.0:consumer.telephone` | `phoneNumber` |
:::
:::details eHerkenning attribute name changes (Click to expand)
:::CustomTable
| Legacy Attribute Name | New Attribute Name |
| --- | --- |
| `urn:etoegang:1.11:attribute-represented:AddressArea` | `organisationAddressArea` |
| `urn:etoegang:1.11:attribute-represented:AdminunitFirstline` | `organisationCountryCode` |
| `urn:etoegang:1.11:attribute-represented:AdminunitSecondline` | `organisationRegion` |
| `urn:etoegang:1.11:attribute-represented:ChamberOfCommerce` | `chamberOfCommerce` |
| `urn:etoegang:1.11:attribute-represented:CompanyName` | `organisationName` |
| `urn:etoegang:1.11:attribute-represented:EORI` | `organisationEori` |
| `urn:etoegang:1.11:attribute-represented:KvKnr` | `organisationKvkNr` |
| `urn:etoegang:1.11:attribute-represented:LEI` | `organisationLegalEntityIdentifier` |
| `urn:etoegang:1.11:attribute-represented:LocatorDesignator` | `organisationLocatorDesignator` |
| `urn:etoegang:1.11:attribute-represented:LocatorName` | `organisationLocatorName` |
| `urn:etoegang:1.11:attribute-represented:POBox` | `organisationPoBox` |
| `urn:etoegang:1.11:attribute-represented:PostName` | `organisationCity` |
| `urn:etoegang:1.11:attribute-represented:SEED` | `organisationSeed` |
| `urn:etoegang:1.11:attribute-represented:SIC` | `organisationSic` |
| `urn:etoegang:1.11:attribute-represented:TaxReferenceNumber` | `organisationTaxReferenceNumber` |
| `urn:etoegang:1.11:attribute-represented:Thoroughfare` | `organisationStreetName` |
| `urn:etoegang:1.11:attribute-represented:VATRegistrationNumber` | `organisationVatRegistrationNumber` |
| `urn:etoegang:1.11:attribute:BirthName` | `birthName` |
| `urn:etoegang:1.11:attribute:non-transliterated:FamilyName` | `eherkenningLastNameNonTransliterated` |
| `urn:etoegang:1.11:attribute:non-transliterated:FamilyNameAtBirth` | `eherkenningLastNameAtBirth` |
| `urn:etoegang:1.11:attribute:non-transliterated:FirstName` | `eherkenningFirstNameNonTransliterated` |
| `urn:etoegang:1.11:attribute:non-transliterated:FirstNameAtBirth` | `eherkenningFirstNameAtBirth` |
| `urn:etoegang:1.12:EntityConcernedID:PseudoID` | `eherkenningPseudoID` |
| `urn:etoegang:1.13:attribute-intermediate:CompanyName` | `eherkenningIntermediateOrganisationName` |
| `urn:etoegang:1.13:EntityConcernedID:Pseudo` | `eherkenningPseudo` |
| `urn:etoegang:1.13:IntermediateEntityID:TRR-BD` | `eherkenningIntermediateTrrBd` |
| `urn:etoegang:1.9:attribute-represented:HouseNumber` | `organisationHouseNumber` |
| `urn:etoegang:1.9:attribute-represented:HouseNumberSuffix` | `organisationHouseNumberSuffix` |
| `urn:etoegang:1.9:attribute-represented:PostalCode` | `organisationPostalCode` |
| `urn:etoegang:1.9:attribute:12OrOlder` | `12OrOlder` |
| `urn:etoegang:1.9:attribute:16OrOlder` | `16OrOlder` |
| `urn:etoegang:1.9:attribute:18OrOlder` | `18OrOlder` |
| `urn:etoegang:1.9:attribute:65OrOlder` | `65OrOlder` |
| `urn:etoegang:1.9:attribute:FamilyNameInfix` | `familyNameInfix` |
| `urn:etoegang:1.9:attribute:Initials` | `initials` |
| `urn:etoegang:1.9:attribute:PlaceOfBirth` | `placeOfBirth` |
| `urn:etoegang:1.9:EntityConcernedID:KvKnr` | `chamberOfCommerce` |
| `urn:etoegang:1.9:EntityConcernedID:RSIN` | `eherkenningRsin` |
| `urn:etoegang:1.9:IntermediateEntityID:KvKnr` | `eherkenningIntermediateKvkNr` |
| `urn:etoegang:1.9:ServiceRestriction:Vestigingsnr` | `eherkenningVestigingsNr` |
| `urn:etoegang:core:ServiceID` | `eherkenningServiceID` |
| `urn:etoegang:core:ServiceUUID` | `eherkenningServiceUUID` |
:::
#### Use legacy attribute naming for iDIN, eHerkenning and DigiD
:::note Important
This option applies only to attributes in the *response* object. This means that you need to use the new attribute names in the authentication *request*.
:::
In the eID and Wallet Hub, you can configure your legacy SAML connection to return attributes with the legacy naming in the response, as you used to receive them in the Signicat Identity Broker. For example, this option allows you to receive `urn:nl:bvn:bankid:1.0:consumer.bin` instead of `bin` from authentications with iDIN. This means that you receive data points that follow the original naming instead of the new attribute names.
To enable legacy attribute naming in your legacy connections, do the following:
1. Log in to the [Signicat Dashboard](https://dashboard.signicat.com/).
2. Navigate to **Products** > **eID and Wallet Hub** > **Legacy** > [**Legacy connections**](https://dashboard.signicat.com/bca/oidc).
3. Select the SAML 2.0 legacy connection you intend to edit.
4. In the connection page, navigate to the **Advanced** tab.
5. In the Advanced tab, tick `Use legacy attribute naming for iDIN, eHerkenning and DigiD`.
6. Click **Save** at the bottom to save the changes.
:::warning DigiD: Exception
If you enable the `Use legacy attribute naming for iDIN, eHerkenning and DigiD` for your connection to DigiD and request `nin`, the authentication response will only contain legacy attribute. Therefore, `nin` is not provided in the response object since it is a new attribute introduced in the eID and Wallet Hub.
However, you can still receive the BSN (what `nin` returns) through a separate attribute like `idpId`.
:::
:::info Option not available
If the `Use legacy attribute naming for iDIN, eHerkenning and DigiD` checkbox is not available in your SAML 2.0 connection configuration in the Signicat Dashboard, contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
## Example responses
Below, you can find examples of responses from different eIDs with comparisons between the responses you used to obtain from Signicat Identity Broker and the new responses in the Signicat eID and Wallet Hub.
### Signicat Identity Broker
```xml title="DigiD reponse example in the Signicat Identity Broker"
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
900234854
https://*SP_CLIENT_DOMAIN*/saml
900234854
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
https://was-preprod1.digid.nl/saml/idp/metadata
```
```xml title="eHerkenning reponse example in the Signicat Identity Broker"
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
03659FB1FAE5D26DB2D28866C1A4FE7F4E1CD5E62DD2552EE3D3B11D4C27163D@9162F54B3B07284AC4E147A849DEAEE4
https://*SP_CLIENT_DOMAIN*/saml
03659FB1FAE5D26DB2D28866C1A4FE7F4E1CD5E62DD2552EE3D3B11D4C27163D@9162F54B3B07284AC4E147A849DEAEE4
52035476
850272038
urn:etoegang:DV:00000003244440010000:services:9121
cf1c1457-cc97-4b47-a324-25d1a97db3cb
24444001
email@example.com
Gerarda Josephina
Kierkegaard
1928-12-09
represented company name
intermediary company name
03659FB1FAE5D26DB2D28866C1A4FE7F4E1CD5E62DD2552EE3D3B11D4C27163D@9162F54B3B07284AC4E147A849DEAEE4
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
urn:etoegang:HM:00000003520354760000:entities:9713
```
```xml title="iDIN reponse example in the Signicat Identity Broker"
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
FANTASYBANK1234567890
https://*SP_CLIENT_DOMAIN*/saml
de
info@equensworldline.nl
Vries-Jansen
Jansen
19750725
DE
1
VJ
+31203051900
de
Vries
Pascalstreet
19
0000AA
Aachen
de
FANTASYBANK1234567890
urn:oasis:names:tc:SAML:2.0:ac:classes:Smartcard
idin
```
### Signicat eID and Wallet Hub
```xml title="DigiD reponse example in the eID and Wallet Hub"
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
s0VCNNq9aysShPBhbD1LnyHTmtuK9v789e6ST1sD-Pc=
https://*SP_CLIENT_DOMAIN*/saml
900234854
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransporthttps://was-preprod1.digid.nl/saml/idp/metadata
```
```xml title="eHerkenning reponse example in the eID and Wallet Hub"
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
MfNtm-LbN8Qxi0b9wT-wAZ31QwwV5FHkh-iAnzqrVWY=
https://*SP_CLIENT_DOMAIN*/saml
Gerarda Josephina Kierkegaard
Gerarda Josephina
Kierkegaard
1928-12-09
email@example.com
03659FB1FAE5D26DB2D28866C1A4FE7F4E1CD5E62DD2552EE3D3B11D4C27163D@9162F54B3B07284AC4E147A849DEAEE4
52035476
850272038
urn:etoegang:DV:00000003244440010000:services:9121
cf1c1457-cc97-4b47-a324-25d1a97db3cb
24444001
represented company name
intermediary company name
03659FB1FAE5D26DB2D28866C1A4FE7F4E1CD5E62DD2552EE3D3B11D4C27163D@9162F54B3B07284AC4E147A849DEAEE4
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransporturn:etoegang:HM:00000003520354760000:entities:9713
```
```xml title="iDIN reponse example in the eID and Wallet Hub"
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
Cf-jk2TjFLNaZ2rEMDjuz6YUecBKQrfCJbHgNPPQBnI=
https://*SP_CLIENT_DOMAIN*/saml
de
Vries-Jansen
Jansen
VJ
de
Vries
de
VJ de Vries
VJ
de Vries
1975-07-25
info@equensworldline.nl
1
Pascalstreet 19, 0000AA, Aachen, DE
Pascalstreet
19
Aachen
0000AA
DE
+31203051900
FANTASYBANK1234567890
urn:oasis:names:tc:SAML:2.0:ac:classes:Smartcard
idin
```
---
## Client authentication with Private Key JWT
When requesting tokens you can use a signed assertion as authentication instead of the basic authentication with a client ID and client secret pair. In Private Key JWT your application creates and signs a JWT using a private key.
Private Key JWT is a client authentication method that is more secure than the default “Client Secret” method. Note that Private Key JWT involves additional steps on your end.
## Prerequisites
Before configuring an application that authenticates using Private Key JWT, you must generate an RSA key pair.
You can choose between:
- Import the public part of an existing key pair into the Signicat Dashboard, or
- Generate an RSA key pair directly in the Signicat Dashboard.
#### Import the public key
If you wish to generate your own key pair, make sure you meet these technical requirements:
1. Generate a JWK RSA key pair (2048-bit) suitable for encryption. We also support 4096-bit if required. It is important that you create a JWK or an X509 certificate. We recommend using the JWK format.
2. Store the **public part** of your key pair in a text file (or `.json`).
If you chose to create your own key pair, then in the next section click **Import public key** instead of **Add public key** in step 2.
#### Generate the key pair
To generate a key pair in the Signicat Dashboard:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select the client you wish to use. If you haven't created a client yet, see [Set up an OIDC client](/docs/eid-hub/oidc/oidc-client.mdx).
3. In the client menu, navigate to **Advanced** > **Public keys** and then **Add public key**.
4. Fill in the **Name**, **Not valid before** and **Not valid after** fields for your key.
5. Select **Signing** as the **Usage**.
6. Now press **Create**. If you want to upload your public key, either paste your key content or upload a file with the key.
7. A key pair is generated for you. This contains a public key and a private key. Take a copy of the private key and store it somewhere safe.
You are now ready to move on to the implementation.
## Implementation
:::note Before you continue
Private Key JWT modifies how your application sends the **token endpoint request**, therefore this section assumes that you first start an OIDC authentication request as for any client authentication method.
Before you continue, your application should have already completed these steps:
- Start an OIDC authentication request.
- Authenticate the end-user.
- Receive an authorization code on your chosen redirect URI.
After these steps, the Private Key JWT implementation below applies.
:::
Authenticating using Private Key JWT consists of two steps:
1. Building the assertion. This is a JWT signed by the private key that you generated.
2. Exchanging the assertion for an access token to authenticate with Signicat.
### Step 1. Building the assertion
Begin by crafting an assertion in the form of a JSON Web Token (JWT).
:::details What is a JWT?
A JSON Web Token (JWT) consists of three parts separated by dots (`.`), which correspond to:
- Header
- Payload
- Signature
A JWT typically looks like:
`xxxxx.yyyyy.zzzzz`
:::
The payload of the JWT should contain the following valid claims:
:::CustomTable{columnWidths="15% 15%"}
| Claim | Name | Details |
|:------|:-----------|:-----------------------------------|
| `iss` | Issuer | The client ID of your OIDC client. |
| `sub` | Subject ID | The client ID of your OIDC client. |
| `aud` | Audience | Must match your 'Token URL'. To find this value, see your [**OIDC client**](https://dashboard.signicat.com/oidc-clients/) in the Dashboard. |
| `jti` | JWT ID | The unique identifier for the JWT. Mitigates replay attacks. |
| `iat` | Issued At | The UNIX timestamp (in seconds) of when you created the token. |
| `exp` | Expire | The UNIX timestamp (in seconds) of when your token will no longer be valid. We recommend `now + 10 minutes`. |
:::
An example of JWT payload would look like:
```json
{
"iss": "",
"sub": "",
"aud": "https:///auth/open/connect/token",
"jti": ,
"iat": 1673955575,
"exp": 1673961575,
}
```
Now, create a signed JWT using a payload similar to the one above. Serialise this as a compact format JWT. The serialised JWT is a long string that looks like: `eyJhbGciOiJSUzI...AiOiJKV1QifQ.eyJpc3Mi...J1ZX0.nmupzTs...H9whojA`
#### Code example
In the example below, the Python script shows how to generate the assertion:
```python
from time import time
from uuid import uuid4
from jwcrypto import jwk, jws
# For the sake of simplicity, the JWKs has been manually loaded into a dictionary.
# In a real life scenario you should do this in a secure manner: The jws_private_key should be stored securely on your premise.
jws_private_key = {
"kty": "RSA",
"kid": "my-kid-123",
"use": "sig",
"alg": "RS256",
"e": "AQAB",
"n": "2sZ0sfbK7bZWOZgAYGWvEkL-9HWt-UadCKRyZHgIRNxvS1KdNZE4chcXF7sXfuAim6Ec_WbcEqGTOzOmQF-VejluB6jO-banEKl3pTGxRj2xj5tBFbtpWyj_AENHxpzbb7EPR_ahIPyvQeCU3VFOEw8juVd9X3gn_iJdmxbN7yIWzhuMRimAleT04AR8SP-g9NUauaEZSrIwny_JbeZ_Fb1m2XfPTB8KbbnYPeyQTQRy_2H5vMLRYGhOFyF9DS_6TguJlSc2VdPLsfW_uhbS4X1fd8-RVbF8UJ6lSanOhmIw1Choh_ncy90-tmmsk6T2QPKBwY0UqgU6bAv5iD2pdw",
"d": "eRHSipn0-1Aor3661p3vIMAKr-Zf_M9jH-FBnPAAQ3tp69kwPvC6uAinMu7Ktd_7xvyGOoWtzHG2NNEEdCNxaU5W4c49nFvEYKgoGjdBz4lctghJIGmyiExLsi2JjxRHK6xktIJ78PFlW6OZPlE8T7fVIUCVlTu9hhomiyk3ldnVjrwJ5ESzaJs_zh6dqNcbfP-8APbG74ACejG3ojp9DWadOwA6kDtKIGdBAHZxObDJtG8qKQDcqvrxBUDXkifl-7t3b97HhxMRyR-d6wvrmz5mkYEzNZJt6LYkCyeGkE-IoQmPM0qYiWI7F3H4E1YjCoGlueoAQCoGOkFCMLYMQQ",
"p": "8_fKHLlwG_t57jsYG97ggGiYnFV9P6FMU3xe6dptMMrqhuPl_XbMic8CA-vOVP_nTgxDfaEnv_wlGcYgVLwdlIICjvoLB1Fma4SguAVCloIZbYsiXBwpfXiTWn-RgSe1HtTbfzpmBpt4RJiHEPoWx34ZUDZhcSpREuO2sIG_U18",
"q": "5ZCYsdA2yJmGJ_quksnNVIa8cby_a_SfFKg_5-CYSKyoZFaZttaNL064f0DCCO4tEp31W37_SankFUkdMDN8ccyW6xwnOj3PJRTX2J79sXdKaJDGleEXCKzuF7Rbi0nouP-1YFxjRmRh5WjBRDvbyCc-m_1ofxbwRskw3CPiOOk",
"dp": "GU9YoXg_gDero6Jv0txhcBDp3DYmQ0apk3OwqRQnBcvXXt0fzBbaC2X1cJCzHDBcP8WX7t2cMReoha7_RasqanC-cTTRlhXEyVy-C7lH-jNPDgVEMEgfqcurhdT8NGj5KlSs3NsjIIZaiMtGH-XCHTogyCiMHWBlfs8u8crUHYM",
"dq": "WiqSHv0mF2JdlCRdHyCOOo31REMbeH6LYSS4fQ31Ik5WkZqGI49fwt4Lj0fTLojGQVKzhS17feZxxH6ELWN7lIMEH_Jd4f1W-DyYjufbwzGUkz-SEFppnqm1lq_raOkttEQTbHa9M2_IF8AucOuF5rarW7-LpKdQ1qy9OSoK98k",
"qi": "rR6CplTi8roFIPwTes4puAABvN-agWh6jRxVVll1SfjqBFoTQvBHp8bUhJO7zmAEhOh-oDQX5Prn24CDKu_kr7emD-WeF9qaGJG1Gltrnh_-nj2XWpfMFmeJWOcflAWJPeltRn3f9PUrnujMDHNDg4EsD8f-ckzPOldqTH_zF_Y"
}
# Loading key
rsa_jws_private_key = jwk.JWK()
rsa_jws_private_key.import_key(**jws_private_key)
# Token payload (JSON)
payload = {
"iss": "",
"sub": "",
"aud": "https:///auth/open/connect/token",
"jti": str(uuid4()),
"iat": int(time()),
"exp": int(time()+6000),
}
payload_bytes = json.dumps(payload).encode('utf-8')
# Token headers
jws_header = {
"alg": jws_private_key["alg"],
"kid": jws_private_key["kid"],
}
# Creating JWS token
jwstoken = jws.JWS(payload_bytes)
jwstoken.add_signature(rsa_jws_private_key, protected=jws_header)
jws_serialized = jwstoken.serialize(compact=True)
print(f"JWT: '{jws_serialized}'")
```
:::warning Important
This code example is for illustrative purposes only. It is not intended for production usage. Signicat takes no responsibility if this code example is used inappropriately.
:::
### Step 2. Exchanging the assertion
After you build and sign the JWT with the required claims, you are ready to authenticate your application to receive an access token.
Use the signed JWT as your assertion towards Signicat token endpoint. For example,
```
client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
client_assertion={JWT}
```
The HTTP request would be:
```curl
curl --request POST https://api.signicat.com/auth/open/connect/token \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data 'grant_type=authorization_code' \
--data 'scope=openid+profile' \
--data 'code={CODE}' \
--data 'redirect_uri=https%3A%2F%2Fyourdomain.com%2Fredirect' \
--data 'client_id={OIDC_CLIENT_ID}' \
--data 'client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer'
--data 'client_assertion={JWT}'
```
Note that the response you receive back is the same as from any other token endpoint request.
---
## Advanced security considerations
Below you can find guides to advanced techniques to increase the security of your OIDC implementation.
* [**Proof Key for Code Exchange (PKCE)**](/docs/eid-hub/oidc/advanced-security/proof-key-for-code-exchange-pkce): Add PKCE to your OIDC flows
* [**Private Key JWT**](/docs/eid-hub/oidc/advanced-security/client-authentication-with-private-key-jwt): Authenticate by signing a JWT with a private key
* [**Pushed Authorization Requests (PAR)**](/docs/eid-hub/oidc/advanced-security/pushed-authorization-requests-par): Protect your authorization parameters with PAR
* [**Encryption/signing of the request object**](/docs/eid-hub/oidc/advanced-security/send-encrypted-signed-requests): Send signed and encrypted requests to Signicat
* [**Encrypted/signed responses**](/docs/eid-hub/oidc/advanced-security/receive-encrypted-signed-responses): Receive encrypted/signed responses from Signicat
---
## Proof Key for Code Exchange (PKCE)
:::tip Use PKCE
PKCE helps you prevent CSRF and authorization code injection attacks. We recommend that you always use PKCE as it is useful for every type of OAuth client, even web apps that use client authentication.
:::
## Add PKCE in your request
To use PKCE in your request, you need to specify a `code_challenge` and `code_challenge_method` in the authentication URL.
```
https:///auth/open/connect/authorize?
&client_id=
&response_type=code
&redirect_uri=
&state=1725028142040-3nB
&scope=openid%20profile
&code_challenge=tkeeeeUcqFyZCFRfM35wERUWdfo8iFWnIM6F-7ILmXw
&code_challenge_method=S256
&prompt=login
```
To use PKCE, your application should create a cryptographically-random `code_verifier` and from this generate a `code_challenge`.
Most OIDC libraries support PKCE. Code libraries and snippets can also help with implementing PKCE. See [oauth.net: PKCE](https://oauth.net/2/pkce/) for further details.
## How to enforce PKCE in the Dashboard
Optionally, you can configure your OIDC client to always require PKCE. To do this:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Choose the OIDC client and select **Edit**. If you haven't created a client yet, see [Set up an OIDC client](/docs/eid-hub/oidc/oidc-client.mdx).
3. In the **Advanced > Security** tab, tick the **Requires PKCE** box.
**Note**: The client now requires PKCE in every authorization request. Requests without using PKCE will fail.
---
## Pushed Authorization Requests (PAR)
Pushed Authorization Requests (PAR) is an extension for OpenID Connect and OAuth, as detailed in [https://datatracker.ietf.org/doc/html/rfc9126](https://datatracker.ietf.org/doc/html/rfc9126).
PAR has the following advantages:
- Mitigates issues caused by exceeding the max URL length or passing too many and/or too long URL request parameters in your request. When using PAR, you only include a short `request_uri` parameter as a reference.
- Improves security, similarly to [Encryption/signing of the request object](/docs/eid-hub/oidc/advanced-security/send-encrypted-signed-requests.mdx), but in a simpler and more elegant fashion. With PAR, you prevent the end-users (or bad actors) from seeing or tampering with the URL request parameters.
## How PAR works
To use PAR in your OIDC application, you need to:
1. Send a backend request (with the request parameters) to the PAR endpoint. You receive the `request_uri` in the response.
3. Then, change your requests to the `authorize` endpoint to include the `request_uri` parameter, instead of passing URL request parameters.
When using PAR, you specify the payload of the authorization request in the first request to the `par` endpoint. Then, you pass only the reference to the `request_uri` in the request to the `authorize` endpoint.
## Prerequisites
There is no additional configuration to use PAR on a per-request basis.
### How to enforce PAR in the Dashboard
:::tip PAR is always available
If you want to use PAR only on a per-request basis, you may skip this step.
:::
Optionally, you can configure your OIDC client to always require PAR. To do this:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Choose the OIDC client and select **Edit**. If you haven't created a client yet, see [Set up an OIDC client](/docs/eid-hub/oidc/oidc-client.mdx).
3. In the **Advanced > Security** tab, tick the **Requires Pushed Authorization Requests (PAR)** box.
**Note**: The client now requires PAR in every authorization request. Requests without using PAR will fail.
## Implementation
Implementing PAR changes your typical OIDC flow in the following way:
1. You must make a backend call to the PAR endpoint, _before_ you make the request to the `authorize` endpoint.
2. Then, in the request to the `authorize` endpoint include only the `request_uri` (and the required parameters `client_id` and `response_type`), instead of including all the normal URL parameters.
### Step 1. Perform Pushed Authorization Requests
:::warning Send the request from the backend
It is important that you send the PAR request from the backend of your application. Sending the request from the frontend, or any insecure environments, exposes your client secret.
:::
You find the PAR endpoint at `https:///auth/open/connect/par`. For example, `https://example.signicat.com/auth/open/connect/par`.
The HTTP request would be:
```http
POST /auth/open/connect/par HTTP/2
Host: example.signicat.com
Authorization: Basic c2FuZGJveC1zaGlueS1oYXQtMTkxOlVTSnlZMEFsRG1IZkx3cUV6SFp6a2RXZ0tCYUNwS1BNcnRybjZPcVdueERtRjZLOA==
Content-Type: application/x-www-form-urlencoded
Content-Length: 1000
client_id=&response_type=code&redirect_uri=code&scope=openid+profile+nin&prompt=login&state=1724229949354-Dyf&nonce=1725006273399-5Ca
```
Note how you should include the payload with all query parameters, such as `scope` and `prompt`, in the request to the PAR endpoint.
In return, you obtain the `request_uri` in the response from the PAR endpoint.
Example success response:
```http
HTTP/2 201 Created
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{
"request_uri": "urn:ietf:params:oauth:request_uri:851358EAA07A23B315AFC00B1EAA9C34C6C4B04A2DA4B598D455CF1F62E004EB",
"expires_in": 600
}
```
You receive the `request_uri` in the response from the PAR endpoint. Use the value of the `request_uri` in the subsequent request to the `authorize` endpoint.
:::note Combine PAR with Private Key JWT
Note that you can combine PAR with [Private Key JWT client authentication](/docs/eid-hub/oidc/advanced-security/client-authentication-with-private-key-jwt.mdx).
:::
### Step 2. OIDC Authorize request
Now, use the `request_uri` in your `authorize` request, without including the URL request parameters.
Example authorization request:
```
https:///auth/open/connect/authorize?
&client_id=
&response_type=code
&request_uri=urn:ietf:params:oauth:request_uri:851358EAA07A23B315AFC00B1EAA9C34C6C4B04A2DA4B598D455CF1F62E004EB
```
The above are the only changes you need for using PAR. Now, you may continue your OIDC flow as normal.
To learn more about implementing OIDC flows, see the [OIDC implementation](/docs/eid-hub/oidc/oidc-implementation.mdx) documentation.
---
## Encrypted/signed responses from Signicat
As per OIDC specification, Signicat can send encrypted responses. This means we always encrypt the ID tokens and `UserInfo` responses for a given OIDC client.
Responses from Signicat are fully encrypted on the transport layer with HTTPS, but adding message-level encryption can be used as an additional security layer.
This section explains how to set up and process encrypted responses.
:::warning Finnish Trust Network (FTN)
For FTN you are required to receive encrypted responses. In fact, FTN fails if you do not set this up correctly and you are not able to obtain any FTN authentication results.
:::
### Prerequisites
Typically you don't need to create your own keys, as you can generate key pairs in the Signicat Dashboard. If you do want to fully manage your own keys, you need to first generate one and then import it and store it in the Signicat Dashboard, from where we can fetch it.
If you wish to create your own key pair, these are the technical requirements:
1. Generate a JWK RSA key pair (2048-bit) suitable for encryption. We also support 4096-bit if required. It is important that you create a JWK or an X509 certificate. We recommend using the JWK format.
2. Store the **public part** of your key pair in a text file (typically `.json`).
:::note Bringing you own key pair
If you choose to create your own key pair, then in the next section select **Import public key** instead of **Add public key**.
:::
### Required configuration
1. In the Signicat Dashboard, go to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select your OIDC client. To create a new OIDC client, see [Set up an OIDC client](/docs/eid-hub/oidc/oidc-client.mdx).
3. In the client menu, go to **Advanced** > **Public keys** and select **Add public key**. Instead, select **Import public key** if you want to import your own key.
4. Fill in the **Name**, **Not valid before** and **Not valid after** fields for your key.
5. Select **Encryption** as the **Usage**.
6. Now, select **Create**.
7. A key pair is generated for you. This contains a public key and a private key. Take a copy of the private key and store it somewhere safe.
You now have an encryption key that we can use to encrypt the responses we send to you, and that you should be able to decrypt.
Finally, you need to configure the encryption on your client:
1. In the Signicat Dashboard, go to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/). Then, select again your OIDC client.
2. In the menu for the client, select **Advanced** > **Security**.
3. Under **User Info Response Type** select **SignedAndEncrypted**. (If you prefer you can also select **Encrypted**, which is out of scope for this guide.)
4. Enable **Encrypt ID Tokens**.
You are now ready to continue to the implementation.
### Implementation
You should send your requests as normal OIDC requests, since what changes are the responses you receive from Signicat. The ID token and the response from `UserInfo` is a nested JWT which is encrypted and signed. To process it:
1. Decrypt it with your private key from the key pair provided in the Signicat Dashboard.
2. Deserialise the resulting signed JWT and verify it, as you would do with a normal token.
### Code example
:::warning Important
This code example is for illustrative purposes only. It is not intended for production usage. Signicat takes no responsibility if this code example is used inappropriately.
:::
```python
from jwcrypto import jwk, jwe
# ATTENTION: Insert your nested JWT (that you got from Signicat OIDC server) here!!!
jwe_serialized = "eyJh...QifQ.Qq5TQR...xN-PQ.ojSGehTV7xw_xE078sFnTg.in8a...SITqA.SyVNrXe0C3UkKBQ_AVyQiw"
# For the sake of simplicity, the JWKs has been manually loaded into a dictionary.
# In a real life scenario you should do this in a secure manner: The jwe_private_key should be stored securely on your premise.
jwe_private_key = {
"alg": "RSA-OAEP",
"d": "MODJkQVnKx-txB11QSkz2roacDL9z-BqcDq-dYM2OHrI-x4iNpdBWtoS2Hi4OfH6ETmzMnFNVY3oIYoaMTuuWKc0r_QeIIqbkt8MozALusETiB2VtiAiiZU6G2DyAOFaWaoiIlRYO5BciDCM6z4ytfnDFYM7-K-YSA3_V7jDSGjRroGC112lVs9BzA3qjCP8jnb9VvNKUhdcFqsqGU8eRw8fZp73uHyEm9tVHimSPjyLda3XlcxPSEkhqlP4aaleWhkUQJM3bc2YDnpWBjlNuIHsacEA28xrwOqHSqK-b8klvxk-e_w-C-SdlcYhgB5DeSB0bEuCpmV9GKwOp0KhuQ",
"dp": "hkPXP00qlIrioShp3FiXp0_OahJXe4cVNAXLJYgKRsqv72I7AXZltAOXNRanpQDQutDADFsMTx1XxoEQm_GUvTUe-dS-PkBGKJMLjp28zs9G0L4yXUXenKu_vs-3wD4_06WtT_kOyJD48LaQno6SYdUm4JBvS5A1ve2NYI7xDEk",
"dq": "WGmNHsCzREbHgwQCStW9munP16NJzdeXJ0ys7QbLwpOxMEP1BkSznoRw4_0IkSxTtyvWPG9Eo-bPCKfkqILUowG7tniIerf0F6LkCjssPk5wNxEK_Ktt-59_3Wrvs9Iik4tYF0bEqlXyidFq7ayBoRdiPZ0-ELjU-hEqY0GR0Ok",
"e": "AQAB",
"kid": "mykey-123",
"kty": "RSA",
"n": "zOeJ1RJOgP6NlgwEcqa-BtHUC5nNNa2UbsQQsNDQa6KioVcNfiz5WWmQF3FAR7HTAxQveXfgT7PqOmPgiDVHTLcdYlOjcOAESCTFYELsuh58xnA99agM9vPuLVo2x-hwjE_b-1dC3Ph2_gpXwqS6JDjKa5VF-5zMLbVLQJ96yhKGqzQ7TrfXrEcgfzXMipTbQTxpDAFnTyYYQ7lOVp_ms0Kbz4fpRbyGUtzYsgkYBCNwfWgtfXZW7ahMeb84ukbH2nXXQKQsxuSYU-gbK44yVvcvltqg5wMjG39Xo-BUGlJGQzEN0-6QEIqGrMXgTx5B147IV22vT7demmNx2_RXDQ",
"p": "-3lVxpmyecuu7-tceX7eoVjHmUlbHzUkhehkV_axQx5FtX5NRWdzqg8jhmPBBRpMtvG7g55ZQihVTi3sphfP0k1czEPsgJt8diZ4KIMDgimcksyJ8yPP0dZuvdnBVFVdlJDWfimmLxmFwlmw-p3gCAPePbqRjD1vo25Bwi5Dujk",
"q": "0JeicVX3YgVhUXuY_f3BX-VDKR0LH_SLaIaEimuvpleo5AM4El_An8SR-_Z1GXZuzsOvff7d_E79NjwsdhtKKxQiW93awsFD9Fd5fqNUOpB0ikAf-gNz6MCujt9nhS_jvbMsNI6gCRexZ4gD-RB9dj_qXsWWJUJQpcu7QMmeE3U",
"qi": "-MNE31_wnD2aRLiZz0piLD6lHJwSYpGFinBKWp5VPuLdeXAruSdKW82oRTapA-y6s87fB85jcjvW3dAYjzFFsFNpjDzrpCwctIsQVzZt_vVu5Mdon365tFHWyH2xAcTmVxdJGDunR6BKMmnciCdXTgZP8wSAEWrjmVop_ontfM8",
"use": "enc"
}
# Loading JWK key
jwk_jwe_private_key = jwk.JWK()
jwk_jwe_private_key.import_key(**jwe_private_key)
jwetoken = jwe.JWE()
jwetoken.deserialize(jwe_serialized)
jwetoken.decrypt(jwk_jwe_private_key)
jws_serialized = jwetoken.payload
print("\nSIGNED JWT (just like a normal ID token):\n")
print(jwetoken.payload)
```
---
## Encryption/signing of the request object
As per OIDC specification, you can use the (optional) `request` parameter to enable signed and, additionally, encrypted requests. Though not required, using the `request` parameter provides additional security and helps you comply with any Full Message-Level Encryption (MLE) requirements.
Common scenarios for using encrypted/signed requests include masking personal information contained in the request and sending requests that cannot be tampered with by third parties.
### Additional hardening of request object mechanism
You can harden the security of your requests in two ways:
1. Require request object
2. Unique/One-Time-Use request object
These options are discussed below.
#### Require request object
You can configure your OIDC clients to require the request object in any future request. To do this:
1. In the Signicat Dashboard, go to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select your OIDC client. To create an OIDC client, see [Set up an OIDC client](/docs/eid-hub/oidc/oidc-client.mdx).
3. In the OIDC client menu, go to **Advanced** > **Security** and tick **Requires Request Object** to enable it.
After you enable the **Requires Request Object**, all future requests with this OIDC client will require a request object. Requests without a request object will fail. Effectively, this setting forces all requests on the OIDC client to be at least signed.
#### Unique/One-Time-Use request object
If you submit a request object token that contains the `jti` claim, we will ensure that it is unique for this client within 24 hours. This will work automatically without additional configuration required.
If you do not wish to have unique request objects enforced, simply omit the `jti` claim.
This mechanism can effectively prevent “replay attacks” when using request objects, as each request object token can only be used once.
### Types of request objects
The Signicat OIDC solution accepts two types of request objects:
1. **Signed JWT**: A valid JWS token.
2. **Nested JWT**: A token that is first signed (JWS) and then encrypted (JWE).
:::note Encryption keys
To encrypt your nested JWT, you must use one of our public encryption keys, available at: [https://api.signicat.com/auth/open/.well-known/openid-configuration/jwks](https://api.signicat.com/auth/open/.well-known/openid-configuration/jwks).
You can retrieve encryption keys at any time. Encryption keys have the following properties:
- Always contain `"use": "enc"`.
- `"kid"` (key id) starts with `encryption-key`. For sandbox accounts, the `kid` starts with `sandbox-encryption-key`.
:::
:::warning Key rotation
When using our public encryption keys, you must account for key rotation. A key is available for max 39 days, and on occasion even shorter.
To ensure that you always have a valid key, we recommend that you refresh your cache within 7 days.
:::
### Prerequisites
Before configuring an application that authenticates using nested JWTs, you must generate an RSA key pair. To do this, you can either:
- Import the public part of an existing key pair into the Signicat Dashboard, or
- Generate an RSA key pair directly in the Signicat Dashboard.
#### Import the public key
If you wish to generate your own key pair, make sure you meet these technical requirements:
1. Generate a JWK RSA key pair (2048-bit) suitable for encryption. We also support 4096-bit if required. It is important that you create a JWK or an X509 certificate. We recommend using the JWK format.
2. Store the **public part** of your key pair in a text file (or `.json`).
If you chose to create your own key pair, then in the next section click **Import public key** instead of **Add public key** in step 2.
#### Generate the key pair
To generate a key pair in the Signicat Dashboard:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select the client you wish to use. If you haven't created a client yet, see [Set up an OIDC client](/docs/eid-hub/oidc/oidc-client.mdx).
3. In the client menu, navigate to **Advanced** > **Public keys** and then **Add public key**.
4. Fill in the **Name**, **Not valid before** and **Not valid after** fields for your key.
5. Select **Signing** as the **Usage**.
6. Now press **Create**. If you want to upload your public key, either paste your key content or upload a file with the key.
7. A key pair is generated for you. This contains a public key and a private key. Take a copy of the private key and store it somewhere safe.
You are now ready to move on to the implementation.
### Implementation
Begin crafting the OIDC authorisation request. The parameters are standard OIDC parameters. The requirements are as follows:
- The HTTP request can be made using either GET or POST.
- The payload must be a request object, following the [OIDC Core specifications, section 6.1](https://openid.net/specs/openid-connect-core-1_0.html#RequestObject)). An example of a typical payload request object looks as follows:
```json
{
"client_id": "dev-annoyed-sloth-492",
"response_type": "code",
"redirect_uri": "https://oauth.tools/callback/code",
"acr_values": "idp:ftn",
"state": "ABCDEF012345",
"scope": "openid profile",
"iss": "dev-annoyed-sloth-492",
"aud": "https://team-connect-demo.test.signicat.dev/auth/open",
"iat": 1673955575,
"exp": 1673961575,
}
```
Note that the JWT requires the following additional claims to be valid:
:::CustomTable{columnWidths="25% 75%"}
| Claim | Explanation |
|:------|:-----------------------------------|
| `iss` | Issuer - needs to be the same as your `client_id`. |
| `aud` | Audience - needs to be equal to your 'Issuer URL'. (Check your client on the [Dashboard](https://dashboard.signicat.com) to find it.) |
| `iat` | Issued At - A UNIX timestamp (in seconds) for the time at which you created the token. |
| `exp` | Expire - A UNIX timestamp (in seconds) for the time at which your token will no longer be valid. We recommend `now + 10 minutes`. |
:::
**Steps:**
1. Create a signed JWT using a payload similar to the one above. Serialise this as a compact format JWT. The serialised JWT is a long string.
2. Now, create an encrypted JWT using the serialised signed JWT from above as the payload. This should again be serialised as a compact format JWT.
3. Use this nested JWT as your request object towards Signicat. For example, `/auth/open/connect/authorize?client_id={CLIENT_ID}&request={REQUEST_OBJECT_JWT}`.
### Code example
:::warning Important
This code example is for illustrative purposes only. It is not intended for production usage. Signicat takes no responsibility if this code example is used inappropriately.
:::
```python
from time import time
from jwcrypto import jwk, jwe, jws
# For the sake of simplicity, the JWKs has been manually loaded into a dictionary.
# In a real life scenario you should do this in a secure manner: The jws_private_key should be stored securely on your premise.
# The jwe_public_key should be dynamically fetched from Signicat's JWKS endpoint.
jws_private_key = {
"alg": "RS256",
"d": "IfHsADmK2xsxbie2Q4pX5cOEfWEeD8efIC82_PtK7AT-ZO3vwll9WUQ_VMWXZuUkmDDwuLukp-GCAq871YfsJKTEXYibArYZSB6yPo7FHMxtEtsfOqDGEjCJHd76AE99ZH8qA2H_0j_xGMGbAP44x5DoTAidj1B3fKEF_IQfoHNfvQBwLaE2lyJVxQp_Xzay_VbdeGRlacmzc8ccGWU3lpAYDONMPxh0Z9tx2aexarDOjFbZ0jKN9b9-Hyntnz7iOFdiOWSHo41NOd5l2BG4SARdRPUwoMxcEexxVVPjpr1smNwLHJZdAvOMiHSAKDAwKh4Vgu4p5CfD6O6JM_PoSQ",
"dp": "TSi83Xlf9XP9DMeqCQgMXUcrxt4nSh56C0RnqRPneGShlObkUZmxJoaEh5TL5OJ-9MQKcGCBN0_LOFls1p4NOvdhZxxwHi2hEZisdd40IY37Z-4JN0L5Xs4jqLDrZAP_paEW1SOI33sqhHCeLi034DZw0-4BxKXm5Fhn-uS2WZ8",
"dq": "jSvo3MsPzigQN_20txhQFxqQaw6M7udXgt51QW50tnM896DlpEd0hbcryOncpfc8AVhjyxLnGG2sYQRLswcq838STu4wDEhuPfhgKAak_5cc38N_TSyRJWLfnwF9pTTWPgkk0Io8MwWpsIpf9qIbyBOl0jHnBdfSuuLKoYM6QfU",
"e": "AQAB",
"kid": "abc123321cba",
"kty": "RSA",
"n": "muNJBpq6VtZbGj0kb5YeMe5lE14CZ4OAKnY6Epzholp61rVrrWRlErmyV9C8J4G6jCgDKrGnjQp143gD71ATVLIus__wO1YtRplKCyz2hypvhvId8GwYOLm1k3TCjKeSa6DwKiKZZOUg011NWN9TSSkCdWb-xNgSV5gZesC_JngofTyrAXT92MDIzGoCMpA1D6tDIzadIigHA7_FznpT1eN5cAHZqMeRC8MHRH2_K8erUxx4QFuencrADmaf4vIWjTlmPioxa4XLRrYcXsnKrrKeVp8CXRFqMwb0fAtRmvQu3RHUqZ02dlTER7ocIbrHeYx2_VAxhqFtLhR9J2ih0w",
"p": "zpfR9mwYoPB-r1wTy5owD8RaoufPeVnabefe7IK9nwGUOkgINHDGTRPvXx2f0UuKz9kAVB6ZIsPgwCfhoMrbdQemNLXu5VZ_MRny6Uesk_5Awox5QIBbYvzF6PnMfV-pwLtieNLpiN_sP-pF6jfvJ8cy3XFBUnF5IDy0zeuI4Lc",
"q": "v-3u72-IPZpVuY8hkqi8gPpc5FTSWh-MJ5BvOcifDFjVYEE-KCTL5I2MJ2R9u-1sVceeFwfa-HfgV3ArizO91-pSJSqk-Py3KqHDXXdno30wwwJWR8noSwH8eRwqdQHBQQPa0ClywQJ2bbqiiw30CpjXDHknL5qXQEskpoJq88U",
"qi": "SGo4PyG344Uxddy_g_YGTt5pa_lvq0G42jGWU-fOPQfjSiNWhzuyflys9YoSf_x3kzwf1oJosdUdCpfUXzLX1LHsWrUld-52JFPtuFT3nNVZiFXCnboUHJSIlgaP1GlA1rHhh491gMIPqr4uJY3BSKp7aj2efL61Z-1l-LvwrSw",
"use": "sig"
}
jwe_public_key = {
"kty": "RSA",
"use": "enc",
"kid": "sandbox-encryption-key-0eb954d0e12b824b80a3c5664232320a",
"e": "AQAB",
"n": "trU6figprTeSBBTdW7Lqm6OjgNg4neNSvtEUs__bf5iK59W9oH2oeZLPx7ixmuJ3Cane6WHCR4BumxtnoIixWlNAJgdu_xosI-zO_7fhUVIgS-qH5kY9rj8GUa6GUquAV92_L3nnEWgKJ_220jV8_kdaqab1Pm5QMJ9RSC73BWuvCZ5fWb57okFN5-dTtjZ-WCmgij-9axPKjlM0PTp4c8Lm8KJDO-B-6n8DO9JEfdBpa6ejEIGi3tNJAyveluTzZ5YyF_WFD4rJZ2JIJIuGth7-o1Myq5QhmaXBTrL01aY-bLgiqWrtBNpM2rnU3MMUQn0TOpzKVvRaTl-x5HIpvw",
"alg": "RSA-OAEP"
}
# Loading keys
jwk_jws_private_key = jwk.JWK()
jwk_jws_private_key.import_key(**jws_private_key)
jwk_jwe_public_key = jwk.JWK()
jwk_jwe_public_key.import_key(**jwe_public_key)
# Token payload (JSON)
payload = {
"client_id": "dev-annoyed-sloth-492",
"response_type": "code",
"redirect_uri": "https://oauth.tools/callback/code",
"state": "ABCDEF012345",
"scope": "openid profile",
"iss": "dev-annoyed-sloth-492",
"aud": "https://team-connect-demo.test.signicat.dev/auth/open",
"iat": int(time()),
"exp": int(time()+6000),
}
payload_bytes = json.dumps(payload).encode('utf-8')
# Token headers
jws_header = {
"alg": jws_private_key["alg"],
"kid": jws_private_key["kid"],
}
jwe_header = {
"alg": jwe_public_key["alg"],
"enc": "A128CBC-HS256",
"kid": jwe_public_key["kid"],
}
# Creating JWS token
jwstoken = jws.JWS(payload_bytes)
jwstoken.add_signature(jwk_jws_private_key, protected=jws_header)
jws_serialized = jwstoken.serialize(compact=True)
# Encoding JWE token
jwetoken = jwe.JWE(jws_serialized, recipient=jwk_jwe_public_key, protected=jwe_header)
jwe_serialized = jwetoken.serialize(compact=True)
print(f"https://team-connect-demo.test.signicat.dev/auth/open/connect/authorize?client_id={payload['client_id']}&request={jwe_serialized}")
```
#### Detailed tutorial and code example
For an even more detailed description of how to set this up, including code examples, see the [Signed and encrypted tokens](/docs/eid-hub/oidc/code-examples/signed-and-encrypted-tokens.mdx) code example.
---
## CIBA (OIDC extension)
## About CIBA
OpenID Connect CIBA ([Client Initiated Backchannel Authentication](https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0-final.html)) is an extension of the OpenID Connect protocol that allows the client application to initiate the authentication process and receive real-time updates on the authentication status.
## Differences between CIBA and the authorization code flow
The [authorization code flow](/docs/eid-hub/oidc/oidc-implementation.mdx#authorization-code-flow) and the CIBA flow are two different authentication flows in the OpenID Connect protocol.
#### Authorization code flow
In an authorization code flow:
- The client application redirects the user to the authorisation server, where the user logs in and provides consent.
- After successful authentication, the authorisation server redirects the user back to the client application with an authorization code.
- The client application then exchanges this code for an access token and a refresh token by making a direct request to the authorization server's token endpoint.
:::tip When to choose it
This flow is primarily designed for web applications and requires user interaction during the entire authentication process.
:::
#### CIBA flow
The CIBA flow introduces a more flexible and asynchronous approach to authentication.
In a CIBA flow:
- The client application initiates the authentication process by making a backchannel authentication request to the authorization server.
- The server responds with a unique authentication reference.
- The client can then receive real-time updates on the authentication status by polling the token endpoint.
:::tip When to choose it
This flow is particularly useful in scenarios when:
- The client application may not have a user interface, or
- The client application needs to authenticate the user on a different device, or
- You want to create a completely customised login flow with complete control over the UI in a web application or a mobile app (similar to the Authentication REST API [headless flow](/docs/eid-hub/authentication-api/#headless-flow)).
:::
## Application flow
A successful CIBA flow follows the following pattern:
1. The client makes a call to the `backchannel_authentication_endpoint`, indicating in the `acr_values` parameter which eID is being used and possibly passing other parameters applicable for that eID.
2. The client then proceeds to polling the `token_endpoint` which will answer with `authorization_pending` until the end-user has completed the authentication, at which point the usual token response is returned, containing `id_token` and `access_token`.
3. The client may then optionally use the `access_token` to call the `UserInfo` endpoint if needed, or skip this step if the `id_token` already contains the required information.
:::tip More details in the OIDC official documentation
- [Backchannel request parameters](https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0-final.html#rfc.section.7.1) Note that not all parameters are supported by all eIDs.
- [Possible responses from the token endpoint](https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0-final.html#rfc.section.11).
:::
## Setting up an OIDC client for CIBA
To create an OIDC client for CIBA:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select **Create/Add client**.
3. Set the **Primary grant type** to "Ciba".
4. Enter a name for the client.
5. Add the OIDC scopes specific for your integration.
After that, you add a secret to your client and then perform any additional configuration you would like to do.
## eIDs that support CIBA
You can use the buttons below to explore the current list of eIDs that support CIBA.
* [**Swedish BankID**](/identity-methods/sbid/): Learn more about Swedish BankID
* [**MobileID**](/identity-methods/mobileid/): Learn more about MobileID
* [**Norwegian BankID**](/identity-methods/nbid/): Learn more about Norwegian BankID
## Example using Swedish BankID
### The backchannel endpoint
The discovery metadata of your domain with Signicat contains the URL of the `backchannel_authentication_endpoint`. For example, if your domain with Signicat is `yourdomain` then the discovery metadata is available at `https://yourdomain.signicat.com/auth/open/.well-known/openid-configuration` where the `backchannel_authentication_endpoint` is `https://yourdomain.signicat.com/auth/open/connect/ciba`.
The call to the CIBA endpoint should be an HTTP POST request with content-type `application/x-www-form-urlencoded`. Make sure to authenticate the request with Basic authentication and the following parameters:
- `login_hint = endUserIp:127.0.0.1 flow:QR` (`127.0.0.1` is an example. Replace it with the actual public IP address of the end-user.)
- `acr_values = idp:sbid`
- `scope = openid profile nin`
The HTTP request could look like this:
```http
POST /auth/open/connect/ciba HTTP/1.1
Authorization: Basic ZGV2LW...CamdraTd2
Host: yourdomain.signicat.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 100
login_hint=endUserIp%3A127.0.0.1%20flow%3AQR&acr_values=idp%3Asbid&scope=openid%20profile%20nin
```
And the response would look like (some headers omitted for brevity):
```http
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"auth_req_id": "5ddc7357-abe0-6940-b4a3-fd6eb3277830",
"expires_in": 120,
"interval": 1
}
```
To obtain the `autoStartToken` for `APP_LAUNCH` or the data for the `QR` code flow, your application must request it from the token endpoint as described in the following section.
### The token endpoint
From this point on, the flow consists of polling the token endpoint. To do that, we perform HTTP POST calls to the token endpoint with the following parameters
- `auth_req_id = 5ddc7357-abe0-6940-b4a3-fd6eb3277830` (The `auth_req_id` received in the previous response.)
- `grant_type = urn:openid:params:grant-type:ciba`
An example of HTTP request would look like this:
```http
POST /auth/open/connect/token HTTP/1.1
Authorization: Basic ZGV2LW...CamdraTd2
Host: yourdomain.signicat.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 101
auth_req_id=8c65e7e5-f5cc-1b4c-a3f5-9f81985ccc83&grant_type=urn%3Aopenid%3Aparams%3Agrant-type%3Aciba
```
And the response would be (some headers omitted for brevity):
```http
HTTP/1.1 400 Bad Request
content-type: application/json; charset=UTF-8
{
"error": "authorization_pending",
"error_description": "bankid.584e5929-0d9e-4dc7-9890-921f...f252b",
"error_uri": "https://yourdomain.signicat.com/auth/open/config/errors/authorization_pending"
}
```
- In the `APP_LAUNCH` flow, the `error_description` contains an `autoStartToken`. You can use this to construct the app launch URL. The `autoStartToken` will remain the same for the duration of the session.
- In the `QR` code flow, the `error_description` contains the data you need to generate a QR code for the user to scan.
:::warning Animated QR code
Swedish BankID uses an “animated QR code” security feature, which means that a QR code is only valid for a short time (seconds). This means your application must generate a new QR code for each call to the token endpoint and continuously update the QR code displayed to the end-user. In such scenarios, a polling interval of 1-2 seconds is recommended.
:::
Your client should continue to poll the endpoint as long as the response is an HTTP 400 with `error` equal to `authorization_pending`. The token endpoint will respond like this:
- If the user cancels the process, the response will be an HTTP 400 with error `access_denied`.
- If the user takes too long to complete the process, the response will be an HTTP 400 with error `expired_token`.
- If the user has still not fully completed the authentication, the response will be an HTTP 400 with error `authorization_pending`.
- And when the user has successfully completed the process, the response will be an HTTP 200 with the usual token response, including `id_token` and `access_token`.
### Code example
The following is a simplistic Python example of a function that first calls the backchannel endpoint and then makes one call to the token endpoint:
```python
def ciba(end_user_ip, flow='QR'):
# First the backchannel call
url = base_url + '/auth/open/connect/ciba'
headers = {
'Authorization': 'Basic ZGV2LWNs...amdraTd2',
'Content-Type': 'application/x-www-form-urlencoded'
}
data = {
'login_hint': 'endUserIp:' + end_user_ip + ' flow:' + flow,
'acr_values': 'idp:sbid',
'scope': 'openid profile'
}
http_response = requests.post(url, headers=headers, data=data)
ciba_response = json.loads(http_response.content)
print(json.dumps(ciba_response, indent=4))
# And then the token endpoint call
url = base_url + '/auth/open/connect/token'
data = {
'auth_req_id': ciba_response['auth_req_id'],
'grant_type': 'urn:openid:params:grant-type:ciba'
}
http_response = requests.post(url, headers=headers, data=data)
token_response = json.loads(http_response.content)
print(json.dumps(token_response, indent=4))
```
Running the function produces the following output:
```json
{
"auth_req_id": "9761e8e8-a38b-2e40-a7bd-730805ef9e70",
"expires_in": 120,
"interval": 1
}
{
"error": "authorization_pending",
"error_description": "bankid.3a047f6a-5e7b-41...8faf1db5e892",
"error_uri": "https://yourdomain.signicat.com/auth/open/config/errors/authorization_pending"
}
```
### A note about the flow options
In the example above, we exclusively used the `QR` flow. The other option is the `APP_LAUNCH` flow which – instead of the BankID QR code data - returns the `autostarttoken` from Swedish BankID that you can use to launch the BankID app in “same-device” scenarios.
For more information, visit [https://www.bankid.com/en/utvecklare/guider/teknisk-integrationsguide/programstart](https://www.bankid.com/en/utvecklare/guider/teknisk-integrationsguide/programstart).
---
## Authorization code flow (Basic)
This guide is designed to get you started with your integration for end-user authentication. The guide is written for .NET using C# and covers the basics of setting up an authorization code flow.
Learn more about OIDC grant types in the [OIDC implementation](/docs/eid-hub/oidc/) documentation.
## How it works
In an authorization code flow:
- The client application redirects the user to the authorisation server, where the user logs in and provides consent.
- After successful authentication, the authorisation server redirects the user back to the client application with an authorization code.
- The client application then exchanges this code for an access token and a refresh token by making a direct request to the authorization server's token endpoint.
:::tip When to choose the Authorization code flow
The Authorization code flow is primarily designed for web applications and requires user interaction during the entire authentication process.
:::
## Prerequisites
If you do not have an account already, then you need to sign up to the Signicat Dashboard for free and complete the initial preparations. To do this:
1. Sign up to the [Signicat Dashboard](https://login.signicat.com/ownidp/web/registration) and register your profile.
2. Ensure that you have created an [organisation](/docs/dashboard/organisation-management/organisations.mdx).
3. Create an [account](/docs/dashboard/organisation-management/accounts.mdx). To do this:
1. Go to **Signicat Dashboard** > [**Organisation**](https://dashboard.signicat.com/org-mgmt/), then select **+ Add account**.
2. Enter an account name, choose the type of account that you want to create, then select **Create**.
4. Create a [domain](/docs/dashboard/organisation-management/domains/). To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains/), then select **+ Add domain**.
2. To create a standard domain, enter a domain name. Then, select **Add domain**.
3. To create a custom domain, follow the instructions in the [Custom domains](/docs/dashboard/organisation-management/domains/custom/) documentation.
:::tip Account types
We recommend that you create a sandbox account to test our services before going live. Sandbox and production accounts must be set up separately.
:::
This guide assumes you already have installed and properly configured the following in your local machine:
- [.NET Core SDK](https://dotnet.microsoft.com/download/dotnet-core/3.1).
- A code editor, such as [Visual Studio Code](https://code.visualstudio.com/), [Visual Studio](https://visualstudio.microsoft.com/vs/) or [Rider](https://www.jetbrains.com/rider/).
- A command-line interface, such as [PowerShell](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell). All commands in this guide were tested with PowerShell.
Additionally, we strongly recommend you use a library or framework for the implementation, such as the ones provided by [JWT](https://jwt.io/libraries).
## Create an OIDC client
Make sure your OIDC client has been properly created and configured. To do this in the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/). You can find the required client settings below.
:::details Client settings on the Dashboard
- Information
- Name: **_filled_**
- URI: _empty_
- Logo URI: _empty_
- URIs
- Redirect URI: **_filled with 1 (one) URI_**
- For example: _https://localhost:5001/account/callback_
- Post logout redirect URI: _empty_
- Front channel logout URI: _empty_
- Front channel logout session required: **_false_**
- Security
- Primary grant type: **_Authorisation code_**
- Require secret: **_true_**
- Require PKCE: **_true_**
- Allow access token via browser: **_false_**
- User reference access tokens: **_false_**
- Allowed CORS origins: _empty_
- Encrypt ID tokens: **_false_**
- User info response type: _empty (or default)_
- Content encryption algorithm: _empty (or default)_
- Accesses
- Allowed scopes: **_filled with, at least, `openid` and `profile`_**
- Identity provider restrictions: _empty_
- Lifetimes
- All fields with default values
:::
:::warning Add a secret
After saving your client, you must generate a new secret.
:::
## Tutorial steps
### 1. Initialise your project
Start your solution:
```shell
mkdir SignicatQuickStartGuide
cd .\SignicatQuickStartGuide\
dotnet new sln
```
Add an empty web project:
```shell
dotnet new web --name AuthorizationCodeFlowGuide
dotnet sln .\SignicatQuickStartGuide.sln add .\AuthorizationCodeFlowGuide\
```
### 2. Install dependencies
Add support to OpenID Connect authentication workflow by including the following package in your project:
```shell
dotnet add .\AuthorizationCodeFlowGuide\ package Microsoft.AspNetCore.Authentication.OpenIdConnect --version 3.1.7
```
### 3. Startup settings
Under the `Startup` class, do the following.
Set `using` statements:
```csharp
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
```
Create an asynchronous method to redeem the authorisation code for tokens at token endpoint:
```csharp
protected virtual async Task RedeemAuthorizationCodeAsync(AuthorizationCodeReceivedContext context)
{
var configuration = await context.Options.ConfigurationManager.GetConfigurationAsync(CancellationToken.None);
var requestMessage = new HttpRequestMessage(HttpMethod.Post, configuration.TokenEndpoint);
var authInfo = $"{context.TokenEndpointRequest.ClientId}:{context.TokenEndpointRequest.ClientSecret}";
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Basic", authInfo);
var tokenEndpointRequest = context.TokenEndpointRequest.Clone();
tokenEndpointRequest.ClientSecret = null;
requestMessage.Content = new FormUrlEncodedContent(tokenEndpointRequest.Parameters);
var responseMessage = await context.Backchannel.SendAsync(requestMessage);
if (!responseMessage.IsSuccessStatusCode)
{
Console.WriteLine(await responseMessage.Content.ReadAsStringAsync());
return;
}
try
{
var responseContent = await responseMessage.Content.ReadAsStringAsync();
var message = new OpenIdConnectMessage(responseContent);
context.HandleCodeRedemption(message);
}
catch (Exception exc)
{
Console.WriteLine($"An error occurred: {exc.Message}");
}
}
```
Register authentication and controller with views services in the `ConfigureServices` method:
:::tip Value for config.Authority
Your value for `config.Authority` will vary depending on your configuration.
- If you haven't configured a custom domain: in the code sample below, replace `chosen-name` with the name you have chosen for your account.
- If you have configured your own custom domain, change the value of `config.Authority` to `https://your.domain.com/auth/open`.
:::
```csharp {5-35}
public void ConfigureServices(IServiceCollection services)
{
// omitted for brevity
services.AddAuthentication(config =>
{
config.DefaultAuthenticateScheme = "AuthorizationCodeClientAppCookie";
config.DefaultSignInScheme = "AuthorizationCodeClientAppCookie";
config.DefaultChallengeScheme = "Signicat";
})
.AddCookie("AuthorizationCodeClientAppCookie")
.AddOpenIdConnect("Signicat", config =>
{
config.Events.OnAuthorizationCodeReceived = RedeemAuthorizationCodeAsync;
config.Authority = "https://chosen-name.app.signicat.dev/auth/open";
config.ClientId = "YOUR_CLIENT_ID_HERE";
config.ClientSecret = "YOUR_CLIENT_SECRET_HERE";
config.CallbackPath = "/account/callback";
config.UsePkce = true;
config.ResponseType = "code";
config.Scope.Add("openid");
config.Scope.Add("profile");
config.GetClaimsFromUserInfoEndpoint = true;
config.SaveTokens = true;
});
services.AddControllersWithViews();
// omitted for brevity
}
```
Add authentication and authorisation middlewares to the pipeline and change endpoint mappings to default in the `Configure` method:
```csharp {5-11}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// omitted for brevity
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
});
// omitted for brevity
}
```
### 4. Protected resource
To check if everything is working as expected, create a basic controller (_HomeController_) with an Index action and a simple View to it.
The folder and file structure could be similar to this:
```{6,9}
.
├─ SignicatQuickStartGuide.sln
├─ AuthorizationCodeFlowGuide
│ ├─ AuthorizationCodeFlowGuide.csproj
│ ├─ Controllers
│ │ └─ HomeController.cs
│ └─ Views
│ │ └─ Home
│ │ └─ Index.cshtml
│ └─ ...
└─ ...
```
:::warning NOTE
Other folders and files omitted for brevity.
:::
Your **Home** _controller_ could be similar to:
```csharp
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace AuthorizationCodeFlowGuide.Controllers
{
public class HomeController : Controller
{
[Authorize]
public IActionResult Index()
{
return View();
}
}
}
```
Your **Index** _view_ could be similar to:
```html
Index
This is a protected resource! Only visible after authentication.
```
### 5. Run
Execute your project:
```shell
dotnet run --project .\AuthorizationCodeFlowGuide\
```
Open [https://localhost:5001/](https://localhost:5001/) in a browser.
:::tip Use HTTPS
We strongly recommend using HTTPS.
:::
:::tip Port number
Change your port number, if necessary. It's the same host you set on your client's redirect URI.
:::
### 6. Test end-user
Choose **Norwegian BankID** and sign with a [test user](/identity-methods/nbid/test.mdx) as follows:
:::CustomTable{columnWidths="33% 33% 33%"}
| National identity number | One time password | Password |
| :----------------------- | :---------------- | :--------- |
| `01100844350` | `otp` | `qwer1234` |
:::
{/* ## Source code
You can find the complete **quick start guide** source code available for *.NET Core 3.1* on [Signicat's GitHub repo](https://github.com/signicat/Quick-start-guide-Authentication-.NET-Core). (hiding because this is for Green stack)*/}
---
## Code examples
Below you can find tutorials with code examples to help you set up your integration with OIDC.
:::tip Just getting started?
If you are new to the Signicat eID and Wallet Hub, start your journey with the [Quick start](/docs/eid-hub/quick-start/index.mdx) guide.
:::
## Basics
* [**Authorization code flow**](/docs/eid-hub/oidc/code-examples/authorization-code-flow): Set up authentication with the Authorization code flow
## Advanced
* [**Signed and encrypted tokens**](/docs/eid-hub/oidc/code-examples/signed-and-encrypted-tokens): Sign and encrypt request objects, ID tokens and UserInfo
---
## Signed and encrypted tokens (Advanced)
This end-to-end tutorial shows how to set up and use signing and encryption for request objects, ID tokens and UserInfo. The programming language is C# in an ASP.NET web application.
In the below code examples, we will use the domain name `docs.sandbox.signicat.com`.
:::note Note
This is a low-level tutorial. Most middleware or abstractions for OIDC integrations allow you to send and consume encrypted and signed objects and tokens using configuration options rather than writing the type of code displayed in this tutorial.
:::
## Prerequisites
If you do not have an account already, then you need to sign up to the Signicat Dashboard for free and complete the initial preparations. To do this:
1. Sign up to the [Signicat Dashboard](https://login.signicat.com/ownidp/web/registration) and register your profile.
2. Ensure that you have created an [organisation](/docs/dashboard/organisation-management/organisations.mdx).
3. Create an [account](/docs/dashboard/organisation-management/accounts.mdx). To do this:
1. Go to **Signicat Dashboard** > [**Organisation**](https://dashboard.signicat.com/org-mgmt/), then select **+ Add account**.
2. Enter an account name, choose the type of account that you want to create, then select **Create**.
4. Create a [domain](/docs/dashboard/organisation-management/domains/). To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains/), then select **+ Add domain**.
2. To create a standard domain, enter a domain name. Then, select **Add domain**.
3. To create a custom domain, follow the instructions in the [Custom domains](/docs/dashboard/organisation-management/domains/custom/) documentation.
:::tip Account types
We recommend that you create a sandbox account to test our services before going live. Sandbox and production accounts must be set up separately.
:::
This quick start guide assumes you already have installed and properly configured the following in your local machine:
- [.NET Core SDK](https://dotnet.microsoft.com/download/dotnet-core/3.1).
- A code editor, such as [Visual Studio Code](https://code.visualstudio.com/), [Visual Studio](https://visualstudio.microsoft.com/vs/), or [Rider](https://www.jetbrains.com/rider/).
- A command-line interface, such as [PowerShell](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell?view=powershell-7). All commands in this guide were tested with PowerShell.
Additionally, we strongly recommend you use a library or framework for the implementation, such as the ones provided by [JWT](https://jwt.io/libraries).
## Basic setup
1. Create a new OIDC client and a secret for it, as illustrated in the following screenshots.
Create a new OIDC client:
Add a secret:
2. To be able to test it, add the redirect URI `https://oauth.tools/callback/code` to your client. This enables the **Try out this client on oauth.tools!** button on the OIDC Client Management overview page.
So far, this is without any signing and encryption. This will redirect the end-user to `https://docs.sandbox.signicat.com/auth/open/connect/authorize?&client_id=sandbox-happy-root-923&response_type=code&redirect_uri=https://oauth.tools/callback/code&scope=openid%20profile&prompt=login`and then back to the redirect URI where you can redeem the authorization code for a token response with `id_token` and `access_token`, and using the `access_token` to fetch `userinfo` returns:
```json
{
"idp_id": "FANTASYBANK1234567890",
"gender": "0",
"sub": "JDAonVZOyWR-iQExci3RTHkWerjTK8DvhLa6yOr2CVc=",
"idp_issuer": "simulator"
}
```
## Code example for the basic, non-signed and non-encrypted flow
Redirecting the user in a .NET web application could be done as follows:
```csharp
public async Task Plain()
{
JObject wellknown = await GetWellknown();
string authorizeUrl = wellknown["authorization_endpoint"]?.ToString() +
$"?client_id={Properties.Settings.Default.ClientID}" +
$"&redirect_uri={Url.Encode(RedirectUri)}" +
$"&response_type=code&scope=openid%20profile&prompt=login";
return Redirect(authorizeUrl);
}
```
`GetWellknown` is the utility method:
```csharp
private async Task GetWellknown()
{
if (_wellknown == null)
{
string metadata = await _client.GetStringAsync(Properties.Settings.Default.DiscoveryEndpoint);
_wellknown = JObject.Parse(metadata);
}
return _wellknown;
}
```
:::tip Well-known URL
Well-known configuration document path: `/auth/open/.well-known/openid-configuration`
For example: `docs.sandbox.signicat.com/auth/open/.well-known/openid-configuration`
You can view your Well-known URL in the [OIDC Client Overview](https://dashboard.signicat.com/oidc-clients) in the Dashboard.
:::
The user would then be sent to the `authorizeUrl` for authentication, eventually returning to the `RedirectUri` where the following would take place:
```csharp
public async Task Callback(string code)
{
string accessToken;
JObject wellknown = await GetWellknown();
using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, wellknown["token_endpoint"]?.ToString()))
{
httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Basic", BasicAuth);
httpRequest.Content = new FormUrlEncodedContent(new Dictionary
{
{ "grant_type", "authorization_code" },
{ "redirect_uri", RedirectUri },
{ "code", code }
});
HttpResponseMessage httpResponse = await _client.SendAsync(httpRequest);
string responseContent = await httpResponse.Content.ReadAsStringAsync();
dynamic tokenResponse = JObject.Parse(responseContent);
accessToken = tokenResponse.access_token;
}
using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, wellknown["userinfo_endpoint"]?.ToString()))
{
httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
HttpResponseMessage httpResponse = await _client.SendAsync(httpRequest);
string responseContent = await httpResponse.Content.ReadAsStringAsync();
return Content(responseContent, "application/json");
}
}
```
The final output could be like this:
```json
{
"idp_id": "FANTASYBANK1234567890",
"gender": "0",
"sub": "JDAonVZOyWR-iQExci3RTHkWerjTK8DvhLa6yOr2CVc=",
"idp_issuer": "simulator"
}
```
## Setting up the client for message-level signing and encryption
### Signing the request object
The purpose of sending signed request objects to the `authorization` endpoint is to ensure the integrity of the data sent with the end-user browser. To accomplish this, you must craft a request object signed with your own private key, and register the public counterpart of that key in the Signicat Dashboard so that it can be verified that the request is, in fact, signed by you.
To do this:
1. Generate a key pair (public and private): You can generate your own key pair, or use the Signicat Dashboard to generate it for you. To do the latter, open the **Advanced** tab of your client, choose **Public keys** > **Add public key**. Enter your key name and a validity time, choose **Signing** as the purpose and click **Create**.
Signicat will then generate the key, store the public part of the key, and also _display_ the private key for you to copy. Signicat does not store the private key, it is generated for you, for your convenience.
2. You must copy this private key and include it in your application. In the example below, the private key is placed in **Settings**. Here is an example on how you can create and sign the request object:
```csharp
public async Task Signed()
{
// We need some info from the .well-known/openid-configuration
JObject wellknown = await GetWellknown();
// We create a dictionary to hold the parameters that we would previously
// put in the query string but will now go into the request object.
Dictionary requestObjectParameters = new Dictionary
{
{ "client_id", Properties.Settings.Default.ClientID },
{ "redirect_uri", RedirectUri },
{ "response_type", "code" },
{ "scope", "openid profile" },
{ "prompt", "login" },
// For a proper JWT structure, we need to include the following four claims in our JWTs
{ "iss", Properties.Settings.Default.ClientID },
{ "aud", wellknown["issuer"]?.ToString() },
{ "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds() },
{ "exp", DateTimeOffset.UtcNow.AddHours(1).ToUnixTimeSeconds() },
};
// Here, we use https://github.com/dvsekhvalnov/jose-jwt for the key operations
// Let's first get our private sigKey from Settings
Jose.Jwk sigKey = Jose.Jwk.FromJson(
Properties.Settings.Default.JwkSigPrivateKey,
Jose.JWT.DefaultSettings.JsonMapper
);
Jose.JwsAlgorithm sigAlg = (Jose.JwsAlgorithm) Enum.Parse(typeof(Jose.JwsAlgorithm), sigKey.Alg);
// We turn the dictionary into JSON, and then sign it using jose-jwt and our private key
string requestObject = JsonConvert.SerializeObject(requestObjectParameters);
string signedRequestObject = Jose.JWT.Encode(requestObject, sigKey, sigAlg);
// And finally append client_id and our request object to the authorise URL, then redirect the end user
string authorizeUrl =
wellknown["authorization_endpoint"]?.ToString()
+ $"?client_id={Properties.Settings.Default.ClientID}&request={signedRequestObject}";
return Redirect(authorizeUrl);
}
```
The above will trigger the authentication flow and expected result for the end-user when redirected.
### Encrypting the request object
You are now ready to add encryption, for example to encrypt the signed request object in order to maintain the confidentiality of the message. This means that the message you send through the end-user's browser is both *signed* (so that the authorization server knows that it comes from you) and *encrypted* (so that no one except Signicat can decrypt and see the actual message that you're sending).
1. You can use the same code as you used for signing, but with an extra step to add encryption to it. This means you should use the `jwks_uri` in the `.well-known/openid-configuration` metadata to download the public set of keys (JWKs), and then choose one of the keys intended for encryption which you then use to encrypt the request object.
Here is an example:
```csharp
public async Task SignedAndEncrypted()
{
// We need some info from the .well-known/openid-configuration
JObject wellknown = await GetWellknown();
// We create a dictionary to hold the parameters that we would previously
// put in the query string but will now go into the request object.
Dictionary requestObjectParameters = new Dictionary
{
{ "client_id", Properties.Settings.Default.ClientID },
{ "redirect_uri", RedirectUri },
{ "response_type", "code" },
{ "scope", "openid profile" },
{ "prompt", "login" },
// For a proper JWT structure, we need to include the following four claims in our JWTs
{ "iss", Properties.Settings.Default.ClientID },
{ "aud", wellknown["issuer"]?.ToString() },
{ "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds() },
{ "exp", DateTimeOffset.UtcNow.AddHours(1).ToUnixTimeSeconds() },
};
// Below, we use https://github.com/dvsekhvalnov/jose-jwt for the key operations
// Let's first get our private sigKey from Settings
Jose.Jwk sigKey = Jose.Jwk.FromJson(
Properties.Settings.Default.JwkSigPrivateKey,
Jose.JWT.DefaultSettings.JsonMapper
);
Jose.JwsAlgorithm sigAlg = (Jose.JwsAlgorithm) Enum.Parse(typeof(Jose.JwsAlgorithm), sigKey.Alg);
// Now let's fetch the JWKSet and then find a public encryption key in it
string jwksJson = await _client.GetStringAsync(wellknown["jwks_uri"]?.ToString());
JObject jwks = JObject.Parse(jwksJson);
JToken encKeyEntry = jwks["keys"].FirstOrDefault(k => k["use"]?.ToString() == "enc");
Jose.Jwk encKey = Jose.Jwk.FromJson(
encKeyEntry?.ToString(), Jose.JWT.DefaultSettings.JsonMapper
);
Jose.JweAlgorithm encAlg =
(Jose.JweAlgorithm) Enum.Parse(typeof(Jose.JweAlgorithm), encKey.Alg?.Replace("-", "_"));
// Reflects the value set for "Content Encryption Algorithm"
// on the client, in the Signicat Dashboard
Jose.JweEncryption contentEncAlg = Jose.JweEncryption.A128CBC_HS256;
// Using the jose-jwt library, we must also explicitly add the kid header
var extraHeaders = new Dictionary() { { "kid", encKey.KeyId } };
// We turn the dictionary into JSON, and then sign it using our private key
// and then encrypt it using the public enc key from the JWKSet
string requestObject = JsonConvert.SerializeObject(requestObjectParameters);
string signedRequestObject = Jose.JWT.Encode(requestObject, sigKey, sigAlg);
string encryptedRequestObject = Jose.JWT.Encode(
signedRequestObject, encKey, encAlg, contentEncAlg, extraHeaders: extraHeaders
);
// And finally append client_id and our request object to the authorise URL, then redirect the end user
string authorizeUrl =
wellknown["authorization_endpoint"]?.ToString()
+ $"?client_id={Properties.Settings.Default.ClientID}&request={encryptedRequestObject}";
return Redirect(authorizeUrl);
}
```
2. To _require_ the use of request objects so that the OIDC client does not send plain authorization requests, navigate to the [OIDC client](https://dashboard.signicat.com/oidc-clients/) configuration in the Signicat Dashboard. Select your OIDC client, navigate to **Advanced** > **Security** and tick the **Requires Request Object** checkbox.
You can now continue to ensure that the sensitive data you receive from Signicat is also encrypted (and, in the case of `userinfo`, also signed).
## Enabling encrypted ID tokens
In the [Authorization code flow](/docs/eid-hub/oidc/code-examples/authorization-code-flow.mdx) guide, the `callback` method looks as follows:
```csharp
public async Task Callback(string code)
{
string accessToken;
JObject wellknown = await GetWellknown();
using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, wellknown["token_endpoint"]?.ToString()))
{
httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Basic", BasicAuth);
httpRequest.Content = new FormUrlEncodedContent(new Dictionary
{
{ "grant_type", "authorization_code" },
{ "redirect_uri", RedirectUri },
{ "code", code }
});
HttpResponseMessage httpResponse = await _client.SendAsync(httpRequest);
string responseContent = await httpResponse.Content.ReadAsStringAsync();
JObject tokenResponse = JObject.Parse(responseContent);
accessToken = tokenResponse["access_token"]?.ToString();
}
using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, wellknown["userinfo_endpoint"]?.ToString()))
{
httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
HttpResponseMessage httpResponse = await _client.SendAsync(httpRequest);
string responseContent = await httpResponse.Content.ReadAsStringAsync();
return Content(responseContent, "application/json");
}
}
```
There are two parts of the above `callback` method: The first takes the `code` you receive when the user returns to your application after authentication and sends it to the `token_endpoint`, and in returns gets a token response which looks like this:
```json
{
"id_token": "eyJhbGciOiJSUzI1NiWW...JA_xuK8tWEentQ",
"access_token": "eyJhbGciOiJSUzI1NiI...kaY5bPnEcF5xJQ",
"expires_in": 600,
"token_type": "Bearer",
"scope": "openid profile"
}
```
In the `callback` method, you grab the `access_token` and use that as the bearer token to call the `userinfo_endpoint` to retrieve all the claims for the user. However, it is not required to call the `userinfo_endpoint`, since the `id_token` in the token response will return the relevant claims. Learn more about the [UserInfo](/docs/eid-hub/oidc/oidc-implementation.mdx#userinfo).
In the default setup, the `id_token` is signed (JWS) but not encrypted, so if you would base64 decode the JWS body then you would see the claims, for example:
```json
{
"iss": "https://docs.sandbox.signicat.com/auth/open",
"nbf": 1684145090,
"iat": 1684145090,
"exp": 1684145690,
"aud": "sandbox-happy-root-923",
"amr": ["external"],
"at_hash": "mE1Zbc6dFdRkGe2N0MnvmQ",
"sid": "8BD83A26394C6C6EFFBD7A0112CEBC71",
"sub": "JDAonVZOyWR-iQExci3RTHkWerjTK8DvhLa6yOr2CVc=",
"auth_time": 1684145089,
"idp": "idin-simulator",
"idp_issuer": "simulator",
"sandbox": true
}
```
In some scenarios, you would rather have the `id_token` encrypted as well, for confidentiality reasons. To do this, you must enable the **Encrypt ID Tokens** option on the client, under **Advanced** > **Security**.
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select **Edit** next to the client you wish to use.
3. In the client menu, navigate to **Advanced** > **Security** and tick **Encrypt ID Tokens**.
4. Select **Update** to save the changes.
By doing so, the `id_tokens` that you receive are both signed and encrypted (JWE). To use this feature, you must first upload the public encryption key to the client (**Advanced** > **Public keys**). You may also use the **Add public key** feature instead, in which case you let Signicat generate a private-public key pair for you, for convenience:
Signicat will not store the private key, so when the key has been generated, you must copy it and include it in your application. Now, you should be ready to decrypt the ID tokens. To do this, modify your `callback` method accordingly:
```csharp
public async Task CallbackForEncryptedIdTokens(string code)
{
JObject wellknown = await GetWellknown();
using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, wellknown["token_endpoint"]?.ToString()))
{
httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Basic", BasicAuth);
httpRequest.Content = new FormUrlEncodedContent(new Dictionary
{
{ "grant_type", "authorization_code" },
{ "redirect_uri", RedirectUriForEncryptedIdTokens },
{ "code", code }
});
HttpResponseMessage httpResponse = await _client.SendAsync(httpRequest);
string responseContent = await httpResponse.Content.ReadAsStringAsync();
JObject tokenResponse = JObject.Parse(responseContent);
// The above is the same as previously,
// and the relevant changes are the ones below:
string encryptedIdToken = tokenResponse["id_token"]?.ToString();
Jose.Jwk encKey = Jose.Jwk.FromJson(
Properties.Settings.Default.JwkEncPrivateKey,
Jose.JWT.DefaultSettings.JsonMapper
);
// The header of the incoming encrypted id token will
// tell me both the alg and the enc used. Additionally,
// the enc is configured in the Signicat Dashboard
// where it is called "Content encryption algorithm".
string decryptedIdToken = Jose.JWT.Decode(
encryptedIdToken,
encKey,
Jose.JweAlgorithm.RSA_OAEP,
Jose.JweEncryption.A128CBC_HS256
);
return Content(decryptedIdToken, "text/plain");
}
}
```
In this particular case and with the described setup example, there is only one encryption key associated with the client, so you can assume that the ID token will always be encrypted using that key. If there are multiple encryption keys on a client, then it would be necessary to check the `kid` in the header of the incoming encrypted ID token and then select the corresponding private key for decryption.
### Verifying the ID token signature
Regardless of using unencrypted or encrypted ID tokens, you must always be careful to validate the signature of the ID token to verify its authenticity. For that purpose, we introduce a helper method:
```csharp
public async Task VerifySignature(string jws)
{
JObject wellknown = await GetWellknown();
// First we fetch the key id, kid, from the header
IDictionary headers = Jose.JWT.Headers(
jws, Jose.JWT.DefaultSettings
);
string kid = headers.First(h => h.Key == "kid").Value.ToString();
// Now let's fetch the key from the JWKSet published by the authorization server
string jwksJson =
await _client.GetStringAsync(wellknown["jwks_uri"]?.ToString());
JObject jwks = JObject.Parse(jwksJson);
JToken sigKeyEntry =
jwks["keys"].FirstOrDefault(k => k["kid"]?.ToString() == kid);
Jose.Jwk sigKey = Jose.Jwk.FromJson(
sigKeyEntry?.ToString(), Jose.JWT.DefaultSettings.JsonMapper
);
// And finally we verify the signature
return Jose.JWT.Decode(
jws,
sigKey,
Jose.JwsAlgorithm.RS256,
Jose.JWT.DefaultSettings);
}
```
Once you have decrypted the ID token (see the [previous section](#enabling-encrypted-id-tokens)), you obtain a signed JWT (JWS). The header of the JWS tells you which key was used to sign it; you fetch that key from the `jwks_uri` endpoint and feed it into the `Jose.JWT.Decode` method, which verifies the signature and then returns the plain claims. You modify your `callback` method to include this verification at the end:
```csharp
string verifiedIdToken = await VerifySignature(decryptedIdToken);
```
And this yields the following result:
```json
{
"nbf": 1684156135,
"exp": 1684156735,
"iss": "https://docs.sandbox.signicat.com/auth/open",
"aud": "sandbox-happy-root-923",
"at_hash": "A-5ERuKcv5zh1VHPVCu54g",
"sid": "8BD83A26394C6C6EFFBD7A0112CEBC71",
"sub": "JDAonVZOyWR-iQExci3RTHkWerjTK8DvhLa6yOr2CVc=",
"auth_time": 1684156135,
"idp": "idin-simulator",
"idp_issuer": "simulator",
"sandbox": true,
"amr": ["external"]
}
```
## Signed and encrypted userInfo responses
This section completes the equivalent exercise for the userInfo as well (even though we stated above that it is usually not required to interact with the `user_info` endpoint since the ID token will be sufficient).
1. Open your client in the Signicat Dashboard, select **Advanced** > **Security** and then choose to have your userInfo signed and encrypted:
2. Since you will be decrypting JWTs again as described in the [ID token](#verifying-the-id-token-signature) section, you should refactor the decryption to a separate method:
```csharp
public string Decrypt(string jwt)
{
Jose.Jwk encKey = Jose.Jwk.FromJson(
Properties.Settings.Default.JwkEncPrivateKey,
Jose.JWT.DefaultSettings.JsonMapper
);
return Jose.JWT.Decode(
jwt,
encKey,
Jose.JweAlgorithm.RSA_OAEP, Jose.JweEncryption.A128CBC_HS256
);
}
```
3. Go back to your callback method again to modify your previous handling of the userInfo response to the following:
```csharp
using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, wellknown["userinfo_endpoint"]?.ToString()))
{
httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
HttpResponseMessage httpResponse = await _client.SendAsync(httpRequest);
string encryptedUserInfo = await httpResponse.Content.ReadAsStringAsync();
string decryptedUserInfo = Decrypt(encryptedUserInfo);
string verifiedUserInfo = await VerifySignature(decryptedUserInfo);
return Content(verifiedUserInfo, "application/json");
}
```
Executing this final code, you should end up with the following set of decrypted and authentic (in terms of the verified signature) claims:
```json
{
"idp_id": "FANTASYBANK1234567890",
"gender": "0",
"sub": "JDAonVZOyWR-iQExci3RTHkWerjTK8DvhLa6yOr2CVc=",
"idp_issuer": "simulator",
"iss": "https://docs.sandbox.signicat.com/auth/open",
"aud": "sandbox-happy-root-923"
}
```
To summarise, your code and integration should now use signed and encrypted request objects, ID tokens and userInfo responses, verifying both integrity and authenticity of all exchanged messages.
---
## FAQs about OIDC
Get answers to frequently asked questions about your OIDC implementation with Signicat.
### How do I add more redirect URIs?
Go to your [**OIDC client**](https://dashboard.signicat.com/oidc-clients) in the Dashboard and select **Edit**. In the **URIs** tab, you can change, remove or add multiple URIs.
### How do I change the allowed scopes?
Go to your [**OIDC client**](https://dashboard.signicat.com/oidc-clients) in the Dashboard and select **Edit**. In the **Access** tab, you can manage the allowed scopes.
### I lost or want to change a client secret - what do I do now?
If you lose a client secret, you must generate a new one.
The value of a client secret cannot be recovered because Signicat only stores the hash code of the secret, for security reasons.
Client secrets are automatically generated and their value cannot be customised. This is a security feature.
### Why can't I see all the claims in the ID token?
When you create a client, it is configured to return only the claims defined in the OIDC standard (standard scopes).
To change this, go to your [**OIDC client**](https://dashboard.signicat.com/oidc-clients) in the Dashboard and select **Edit**. In the **Advanced** > **Security** tab, you can choose the level of **ID Token User data**.
Other reasons why you don't receive all the claims data could be:
- The end-user data is not present in the IdP database.
- The IdP did not return the data requested.
- The end-user did not consent to sharing the data.
### How can I get end-users to re-authenticate every time? (Disable SSO)
To force the end-user to re-authenticate every time, pass the query parameter `prompt=login` in your [authorization request](/docs/eid-hub/oidc/oidc-implementation.mdx#authorization).
:::note Maximum Authentication Age (`max_age=0`)
When forcing re-authentication, avoid using `max_age=0` as an alternative to `prompt=login`.
:::
### How do I auto-select a specific eID/IdP? (Skip eID selection screen)
To control which eIDs to display to your end-users, you can use the `acr_values` query parameter with the format `acr_values=idp:idp_name`.
Learn more about this feature in the [IdP scoping](/docs/eid-hub/oidc/oidc-implementation.mdx#idp-scoping) documentation.
### How do I show only certain IdPs?
Go to your [**OIDC client**](https://dashboard.signicat.com/oidc-clients) in the Dashboard and select **Edit**. In the **Access** tab, you can configure the **Identity provider restrictions**.
Learn more about this feature in the [IdP scoping](/docs/eid-hub/oidc/oidc-implementation.mdx#idp-scoping) documentation.
### How do I enable PKCE?
Go to your [**OIDC client**](https://dashboard.signicat.com/oidc-clients) in the Dashboard and select **Edit**. In the **Advanced** > **Security** tab, tick the **Require PKCE** box.
We strongly recommend using PKCE. See the section on [Advanced security considerations](/docs/eid-hub/oidc/advanced-security/proof-key-for-code-exchange-pkce.mdx) for further information.
### How do I enable additional encryption and/or signing of messages?
There are two supported options:
1. Signicat sends you encrypted/signed responses. Learn more [here](/docs/eid-hub/oidc/advanced-security/receive-encrypted-signed-responses.mdx).
2. You send encrypted/signed requests to Signicat. Learn more [here](/docs/eid-hub/oidc/advanced-security/send-encrypted-signed-requests.mdx).
### How do I change the language in the authentication flow?
Localisation best practices suggest giving users control over their language preferences. Browsers support user language customisation - sent via the “Accept-Language” request header.
Signicat uses the preferred languages, if available. The fallback language is set to **English**, by default. Note that IdPs might support many languages: English and the IdP native language.
In cases where you want to override end-user language preferences, use the authorization query string parameter `ui_locales`, according to OIDC specifications.
### How do I send prefilled information?
See the [`login_hint` documentation](/docs/eid-hub/oidc/oidc-implementation.mdx#login_hint).
### Can I send extra information in a request, and get it in a response?
The OIDC/OAuth specification does not have any recommended way. The OAuth 2.0 specification states that redirect URIs must be absolute URIs.
Ideally, your system should be agnostic. It should handle authentication requests and complete the process based on the end-user data obtained from the ID token.
If this is not possible you can consider encoding data in the “state” parameter. This is not an official method but a widespread workaround. The data can be base64 encoded, with a hash or a reference, or encoded as a compact JWT.
---
## OpenID Connect
OpenID Connect (OIDC) is an authentication protocol based on the OAuth 2.0 protocol.
OAuth 2.0 is a framework designed to support the development of authentication and authorisation protocols. It provides a variety of standardised message flows based on JSON and HTTP, used by OIDC to provide identity services.
OIDC aims to support end-user authentication and identity information on top of the OAuth 2.0 protocol.
## Signicat OIDC server
Signicat offers the Signicat OIDC server as part of our Digital Trust Platform. The principles of the Signicat OIDC server is that it should be compliant with standards while supporting all the features of our solutions.
:::info Signicat is a certified OpenID provider -
Signicat is certified by the OpenID Foundation as a Basic and Hybrid OpenID Provider of the OpenID ConnectTM protocol.
To explore our certification details, visit OpenID's list of [Certified OpenID Providers](https://openid.net/certification/#OPs).
:::
The OpenID certification is an assurance that the Signicat OpenID server is compliant with OIDC standards and guarantees a more secure implementation for you.
## Get started
* [**Set up an OIDC client**](/docs/eid-hub/oidc/oidc-client): Set up an OIDC client before you start the integration
* [**OIDC implementation**](/docs/eid-hub/oidc/oidc-implementation): Learn about OIDC flows, endpoints, claims, key rotation and more
* [**Test connections**](/docs/eid-hub/oidc/test-connections): Try it out before you start integrating
* [**Code examples**](/docs/eid-hub/oidc/code-examples): Dive deep into code examples
## Advanced topics
* [**Native Mobile Apps**](/docs/eid-hub/oidc/native-mobile-apps): Discover best practices for Native Mobile Applications
* [**Advanced security considerations**](/docs/eid-hub/oidc/advanced-security): Learn about advanced security measures like PKCE and encryption
* [**CIBA (OIDC extension)**](/docs/eid-hub/oidc/ciba): Learn about CIBA and how to set it up
## Migration guides
* [**Migrating from Enterprise**](/docs/eid-hub/migration-guides/enterprise/migration-guide-oidc): Understand the differences before you migrate
* [**Migrating from Broker**](/docs/eid-hub/migration-guides/signicat-identity-broker/migration-guide-oidc/): Understand the differences before you migrate
## Troubleshooting
* [**Frequently asked questions**](/docs/eid-hub/oidc/faqs): Find answers to your questions about OIDC with Signicat
* [**Error codes**](/docs/eid-hub/oidc/oidc-error-codes): View the error codes for OIDC connections
---
## Native mobile apps
When integrating OIDC flows in the development of native mobile apps, you should adhere to best practices to ensure the security and privacy of user data.
One important aspect is how your application performs OIDC authorization requests to offer your users authentication through identity providers.
This guide outlines the recommended approach to designing your native mobile apps and discusses topics such as preferring external user-agents (such as the browser), configuring redirect URIs and opting for PKCE over client secrets.
:::warning App switching on mobiles with MitID
This page does not apply if you set up an integration with MitID. If you want to perform a MitID authentication from your native mobile app, please see the MitID Integration guide > [App switching on mobiles](/identity-methods/mitid/integration-guide/app-switching/) instead.
:::
:::tip References
The content of this guide is based on [RFC 8252: OAuth 2.0 for Native Apps](https://datatracker.ietf.org/doc/html/rfc8252), which we recommend reading to dive deeper into best practices for native apps in the context of OIDC.
Other suggestions on this page are the result of Signicat's many years of industry experience and discussions with experts in the OIDC field.
:::
:::note Glossary
In this guide, we use the term “native app” to refer to an application intended to run natively on a mobile operating system (OS), such as Apple iOS or Google Android.
Web apps, including progressive web apps and single-page applications, that run natively in browsers are not covered here.
:::
## Challenges with native apps
Building an integration for native apps presents the following challenges:
- Secrets stored in a native app are not secure.
- Fragmentation of mobile operating systems:
- Devices can run the latest or any number of older versions of Android or iOS.
- OS versions can have breaking changes between versions.
- On Android, there are often vendor-specific OS versions.
- Fragmentation of web browsers:
- On Android, there can be OS-branded browsers, the most common is the “Samsung Browser”.
- Safari is the standard browser for iOS but many users install other browsers, causing the interaction between Safari and the other browsers to be unpredictable.
- Embedded browsers (such as when implemented in web views) are considered unsafe. Learn more in the [System browsers VS web views](#system-browsers-vs-web-views) section.
- Redirecting users between browser-to-app or app-to-app is challenging on both Android and iOS. Despite several attempts by mobile developers to fix this, the issue has not been solved yet.
To mitigate these challenges with native apps consider the points in the section below.
## Key points for a secure integration
To increase the security of your native app, your application:
- **MUST NOT use client secrets**: Don't use client secrets on native apps because they are not considered safe. You should view your OIDC client as a “public client”.
- **MUST use PKCE**: Public clients are susceptible to the authorization code interception attack. PKCE (Proof Key for Code Exchange) mitigates this threat.
- **Redirect URIs MUST be HTTPS**: Signicat disallows custom URI schemes and loopback URIs. We strongly encourage using URIs that are domain-verified with the OS vendor. Learn more in the [Redirect URIs](#redirect-uris) section.
- **MUST NOT use web views**: When launching authentication views to the end-user, design your application to open views in the system browser and not as a web view. Learn more in the [System browsers VS web views](#system-browsers-vs-web-views) section.
### Redirect URIs
Redirects using custom URI schemes (for example `my-unsafe-app://redirect`) are not considered safe because other apps could hijack your custom URI scheme.
The safest option is to use ”universal links” or ”app links” that have verified domains with Apple or Google respectively. This solution reduces the risk that other apps or malicious actors on the end-user device hijack your redirect URIs. For further information on this topic, consult vendor-specific documentation.
### System browsers VS web views
Web views (which implement embedded user-agents) are problematic for authentication flows for several reasons:
- They can appear less safe to end-users as there is no information on the URL of the webpage or the certificate.
- The cookies that exist in system browsers are not available in web views.
- The host app can copy user credentials and cookies.
- If the OS or end-user triggers a switch to the system browser during the process, the authentication flow might fail in unpredictable ways.
For these reasons, web views are not supported. By avoiding embedded user agents such as web views, you protect user data from potential vulnerabilities.
Conversely, using only external user-agents (with the system browser) for OAuth 2.0 authorization requests in native apps is the best current practice, according to [RFC 8252: OAuth 2.0 for Native Apps](https://datatracker.ietf.org/doc/html/rfc8252). This process, also known as "AppAuth pattern", ensures a secure and trusted environment for users while maintaining the integrity of the app's authentication and authorization processes.
Note that if the end-user has multiple browsers installed on their device, "app switching" between additional browsers and the default browser (Chrome on Androids, Safari on iOS) could occur. This may lead to issues similar to the ones mentioned above. Although there is no definitive solution for this issue, Signicat works to mitigate it where possible. When implementing your solutions, you should be aware of the potential impact.
## Configuring a client in the Signicat Dashboard
When you create your OIDC application with Signicat, you can customise your OIDC client to adhere to best practices. Signicat offers an OIDC client template with the correct configuration for native apps.
### Create a new OIDC client
To create a new OIDC for native apps with this template:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/) and select **Add client**.
2. In **Primary Grant Type**, select which grant type (flow) you want to use with this client. We strongly recommend **AuthorizationCode**.
3. In **Create client from template**, choose “Native/Mobile Application”. Use this template when creating an OIDC client for native apps.
4. Enter the name for the client.
5. Add your Redirect URIs, which should be domain-verified as explained in the [Redirect URIs](#redirect-uris) section above.
6. Click **Create** to create a client for native apps.
When creating the client, you can skip secret creation as you should use PKCE instead of a client secret. For further information about clients, see [Set up an OIDC client](/docs/eid-hub/oidc/oidc-client.mdx).
### Edit existing OIDC clients
To edit an existing OIDC client with the correct configuration for native apps:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select the client you wish to use.
3. In the client menu, click **Advanced > Security**, then untick **Requires Secret** and tick **Requires PKCE**.
4. Add your Redirect URIs, which should be domain-verified, as explained in the [Redirect URIs](#redirect-uris) section above.
Now, you can use the client in your native mobile app to authenticate your end-users.
## Alternative approach: Authentication REST API
Many of our customers prefer to integrate their native apps with the [Signicat Authentication REST API](/docs/eid-hub/authentication-api/) protocol instead of OIDC.
The main reason is that with the Authentication REST API most of the login complexity is managed in the backend of your application. However, this means greater responsibility for your developers to ensure that the binding between a native app and your backend system is properly secured.
Some customers also prefer the general advantages of integrating with a standard REST API, instead of having to deal with open standards, such as OAuth and OIDC.
## Next steps
Dive deeper into OIDC and improve your application with advanced security features:
* [**Advanced OIDC implementation**](/docs/eid-hub/oidc/oidc-implementation): Learn about available flows, endpoints, claims, key rotation, security, error codes etc.
* [**Advanced security considerations**](/docs/eid-hub/oidc/advanced-security): Learn about advanced security measures like PKCE and encryption
Discover the features of the Signicat Authentication REST API:
* [**Authentication REST API**](/docs/eid-hub/authentication-api/): Authenticate your end-user easily and securely with the Signicat Authentication REST API.
---
## Set up an OIDC client
To start authenticating users with OpenID Connect, you first need to register an **OIDC client** in the Signicat Dashboard.
An OIDC client provides you with a **Client ID** that you use in your authentication requests. Depending on the authentication grant type (flow), you may need to add a **client secret**.
On this page, you can learn about how to create and configure an OIDC client in the Signicat Dashboard and prepare yourself to connect to eIDs in the Signicat eID and Wallet Hub.
:::tip Video instructions
You can find a video that shows you how to set up an OIDC client in the [Tutorial video](#tutorial-video) section.
:::
## Add a new OIDC client
To add a new OIDC client in the Signicat Dashboard, do the following:
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select **Add client**.
3. Configure the following properties:
- **Primary grant type**: Choose the grant type you want to implement. We strongly recommend **AuthorizationCode**. For more information about grant types, refer to the [OIDC specification](https://openid.net/specs/openid-connect-core-1_0.html#Authentication) and the [OAuth 2.0 specification](https://oauth.net/2/grant-types/).
- **Create client from template**: Optional. Choose a template to suit your use case. Doing this prefills your client configuration automatically.
- **Client name**: Enter a name for the client.
- **Redirect URI**: Enter the URL where you want to redirect your end-user after they authenticate with an eID. You can add several redirect URIs after you create the client.
- **Scope**: Select the scopes for the user attributes you want to retrieve with this client. `openid` is mandatory. `profile` and `nin` are necessary in most cases. You can see the definition of `profile` and other predefined scopes in the [OIDC specification](https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims). You find scope definitions in the specific [eIDs](/docs/eid-hub/e-ids/) documentation.
4. Select **Create** to create the new client.
:::info Success!
You have now created a new OIDC client. You can view and edit your client in the **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/) page.
:::
Before you can start using the client in your application, you might need to add extra configurations. The next sections explain how to extend your client configuration for the different types of authentication flow.
## How to create a client secret
To add a secret to your OIDC client, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select **Edit** next to your client name.
3. In the client menu, go to the **Secrets** tab, then select **Add secret**.
4. Enter a name for your client secret, then select **Generate secret**.
5. Copy your new client secret and store it safely.
:::warning Important
Make sure you copy and store your client secret securely. You can view your client secret only once, when you create it. If you ever lose your secret, you must create a new one.
:::
## OIDC configuration options
We support additional configuration options for OIDC clients, such as:
- **PKCE (Proof Key for Code Exchange)**: We strongly recommend using PKCE. To enable PKCE in your OIDC client, navigate to the **Advanced** > **Security** tab and tick **Require PKCE**.
- **Encryption**: If you require encryption, you can upload a public key by navigating to the **Advanced** > **Public keys** tab and clicking **+ Add public key**.
- **Redirect URIs**: To configure additional redirect URIs, navigate to the **URIs** tab, then click **Add new**.
- **Scopes**: To add or remove scopes from your client, navigate to the **Access** tab and enter the scope code in the **Allowed scopes** field.
## Try it out
You can run a test authentication with your OIDC application by using [**OAuth Tools**](https://oauth.tools/), a public web application to test OIDC flows.
To learn how to run a test authentication with an eID, visit the [Test connections](/docs/eid-hub/oidc/test-connections.mdx) guide.
## Tutorial video
This video shows you how to set up an OpenID Connect (OIDC) Client for our solutions in the Signicat Dashboard.
---
## OIDC error codes
When you make a call to the Signicat OIDC server and an error occurs, you will receive a response with an error code. The information on this page provides more context to help you understand the cause of common errors.
If you encounter an error and require assistance, you can contact us by [creating a support ticket](https://dashboard.signicat.com/support-tickets/tickets/new) in the Signicat Dashboard.
:::note Troubleshoot the error log in the Dashboard
You can find the complete log of any error in the [Signicat Dashboard > eID and Wallet Hub > Audit Log](https://dashboard.signicat.com/audit).
:::
## Handling OIDC errors
We follow the OIDC and OAuth standards as closely as possible, including how we handle error messages.
**Authorization errors**
Errors from the `/authorization` endpoint are typically returned as URL parameters to the redirect URI. These parameters are:
:::CustomTable
| Parameter | Definition |
|-----------|------------|
| `error` | The error code. |
| `error_description` | A brief description of the error. |
:::
If an error cannot be passed in the redirect URI, we display an [error page](https://api.signicat.com/auth/open/connect/authorize?response_type=code&scope=openid&client_id=INVALID_CLIENT) instead. These errors usually result from an incorrect implementation or invalid configuration and are typically not caused by an end-user interacting with a service.
**Token and userInfo errors**
Errors from the `token` and `UserInfo` endpoints follow the OpenID Connect and OAuth protocol specifications:
1. [Token error response](https://openid.net/specs/openid-connect-core-1_0.html#TokenErrorResponse)
2. [UserInfo error](https://openid.net/specs/openid-connect-core-1_0.html#UserInfoError)
**Standard errors**
Additionally, standard HTTP status error codes may be returned, including:
:::CustomTable
| Status | Error type | Description |
|--------|------------|---------|
| 5xx | Server Errors | Internal failures within a service. |
| 404 | Not Found | The requested URL is incorrect. |
:::
For a list of common OIDC error codes, see the table below.
:::tip Error object and generic error codes
In addition to these product-specific error codes, there are generic error codes which are applicable to all Signicat APIs. To learn about these and how the error object looks, see our generic [Error codes](/docs/dashboard/error-codes.mdx) documentation.
:::
## Common OIDC error codes
---
## OIDC implementation
OpenID Connect is an identity layer on top of the OAuth 2.0 protocol. It enables service providers to verify the identity of an end-user based on the authentication performed by an authorisation server, as well as to obtain basic profile information about the end-user in an interoperable and REST-like manner.
## Flows
OpenID Connect (OIDC) lets developers authenticate users across websites and apps without having to own and manage password files.
Signicat's _authorisation server_ supports the following _grant types_ (often also called _flows_ - or _protocol flows_) defined on OpenID Connect and OAuth 2.0 specifications:
- Authorisation code
- Hybrid
- Client-Initiated Backchannel Authentication (CIBA)
Grant types specify how a client can interact with the token service. To learn more about the different flows and their differences, refer to the [OIDC documentation](https://openid.net/specs/openid-connect-core-1_0.html#Authentication).
The **Authorization code flow** and the **Hybrid flow** are described in this document. To learn more about CIBA, and how it compares to other flows, refer to the [CIBA (OIDC extension)](/docs/eid-hub/oidc/ciba.mdx) documentation.
### Authorization code flow
The authorization code flow provides you with an authorization code. You can exchange the authorization code for an ID token, an access token and a refresh token (optional) at the `token` endpoint of our OIDC server.
This process provides the benefit of not exposing any tokens to the user agent (and possibly other malicious applications with access to the user agent). For the authentication server to trust the client before exchanging any authentication data regarding the end-user, the server can authenticate the client. The authentication code flow is therefore suitable for clients that can securely maintain a client secret between themselves and the OIDC authentication server.
The authorization code flow steps for performing authentication to log in the end-user (or to determine that the end-user is already logged in) are as follows:
1. The user agent requests to be authenticated.
2. The client prepares an authentication request and sends the request to the OIDC server.
3. The authorisation server authenticates the end-user.
4. The authorisation grant code is requested.
5. The OIDC server obtains end-user consent (optional).
1. If consent is asked for but denied, the end-user will not be authorised and will not be able to access their resources. The login will be stopped. The process will end at this step.
2. If consent is asked for and given, the end-user will be authorised. The process continues with step 6.
6. The OIDC server sends the end-user back to the client with an authorization code.
7. The client requests a response using the authorization code at the `token` endpoint of our OIDC server.
8. The client receives a response that contains an ID token, an access token and a refresh token (optional) in the response body (among other parameters).
9. The client validates the ID token, retrieves the end-user's subject identifier and requests resources.
{/*diagram erased, need an updated one*/}
### Hybrid flow
The hybrid flow combines the implicit flow with the authorization code flow. With the hybrid flow, some tokens are returned from the `/authorize` endpoint and others are returned from the `/token` endpoint.
Here's a brief summary of how the hybrid flow works:
1. The user agent requests resources.
2. The client prepares an authentication request and sends it to the OIDC server.
3. The authorisation server authenticates the end-user.
4. The authorisation grant code is requested.
5. The OIDC server obtains end-user consent.
6. The authorisation server sends the end-user back to the client with an authorization code and, depending on the response type, one or more additional parameters.
7. The client requests a response using the authorization code at the `token` endpoint of our OIDC server.
8. The client receives a response that contains an ID token and an access token in the response body (among other parameters).
9. The client validates the ID token and retrieves the end-user's subject identifier.
## Claims
At the heart of OIDC are **claims** - an attempt to standardise all the different units of information about an end-user. A claim may, for instance, be an end-user's surname or email address. Claims are similar to the concept of assertions in SAML, though claims in OIDC are represented (as everything else in OAuth 2.0/OIDC) as JSON key-value pairs.
**Where to get claims?**
The OIDC specification details two sources of claims:
- The **ID token**
- The **`UserInfo` endpoint**
The **ID token** is a signed JSON object (a JSON web token, or JWT) containing the authentication result. You can learn more about the ID token in the [OIDC documentation](https://openid.net/specs/openid-connect-core-1_0.html#IDToken). Some claims in the ID token are optional and can be left out depending on how much information you want it to contain.
The **`UserInfo` endpoint** is a separate endpoint that accepts access tokens and returns information about the end-user. An access token represents an authorisation from the end-user to the client to perform actions on the end-user's behalf. Therefore, only information that the end-user has authorised should be returned. The `UserInfo` claims that can be returned are largely standardised but can be infinitely extended.
:::tip Note
We strongly recommend that you use only the ID token for obtaining claims. Using `UserInfo` usually adds complexity for very little benefit.
:::
## Signing keys
The signing key is a JSON web key (JWK) which contains the public part of an asymmetrical key pair. In general terms, a JWK is a JSON object that represents a cryptographic key.
Signing keys ("use": "sig") are published through JSON web key set (JWKS), a well-known URL available at your Signicat domain. Signicat signs each token with the private key on the authorisation server side.
To verify that a JWT token is valid and originated from the Signicat authorisation server, your application needs to verify the token's signature using the public key published in the JWKS. Signature validation ensures that the token was issued by Signicat and that no one has tampered with the token.
### JSON web key set (JWKS)
A JSON web key set (JWKS) contains a set of keys containing the public keys that your application can use to validate Signicat-issued tokens (JWT), like access and ID tokens.
Note that while the JWKS may contain multiple keys, your application needs to use only one JWK to validate the token's signature.
The JWKS is available at a public endpoint in your Signicat domain. To find your JWKS endpoint:
1. Go to `https:///auth/open/.well-known/openid-configuration`.
2. Locate the endpoint specified in the `jwks_uri` field.
3. Go to the JWKS (`jwks_uri`) endpoint.
The JWKS endpoint contains a JSON with a list of keys for both:
- Production signing keys
- Sandbox signing keys
:::tip Sandbox signing keys
Sandbox keys are prefixed with “sandbox-”. For example, `"kid": "sandbox-signing-key-one"`.
:::
Learn more about JWK parameters in the [RFC 7517 Internet Standards](https://datatracker.ietf.org/doc/html/rfc7517#section-4).
### Key rotation
Key rotation is a process to retire and replace cryptographic keys. This is an industry standard and follows cryptographic best practices.
The JSON web key set (JWKS) endpoint returns several unordered JSON web keys (JWKs) at any given time. The keys in the key set are subject to change because of key rotation.
:::note Key rotation schedule
We rotate keys once a month, but this can change without notice. New keys are normally generated a few days before rotation so that you can update you caching mechanisms before the rotation occurs.
:::
When validating a token consider the following:
- If token signature validation fails, fetching the current key set returns a set where one of the keys is valid.
- New keys for token signing are published to the JWKS endpoint before we retire the key in use for signing. This gives you enough time to fetch the new key set and update your cache.
:::tip When to update your cache?
We recommend you refresh your replica, or cache, of signing keys regularly. Note that we rotate keys frequently. For instance, you could follow these guidelines:
- Refresh your cache when a `kid` (key identifier) is present in the JWKS, but not in your cache.
- Remove a key when the `kid` is present on your side, but not in the JWKS.
:::
## Default signing and encryption
- Encryption algorithm: AES-128
- Supported key length: 2048-bit (4069-bit also supported)
- Signature hash: SHA-256
:::CustomTable{columnWidths="33% 33% 33%"}
| **What?** | **Signing** | **Encryption** |
| :------------------ | :----------------------- | :----------------------- |
| ID token | Always | Optional, off by default |
| Access token | Always | Never |
| `UserInfo` response | Optional, off by default | Optional, off by default |
:::
:::warning Note
Elliptic curve cryptography (ECC) key pairs are not supported at the moment. If your implementation requires this feature, you need to contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
## Endpoints
The following endpoint URLs are available for communicating with the OpenID Connect provider through Signicat.
### Authorization
The Authorization endpoint is where you send the end-user to perform an authentication. You can find your OIDC authorization endpoint at `https:///auth/open/connect/authorize`. For example, if your domain is `https://verybigcorp.signicat.com`, your discovery URL is `https://verybigcorp.signicat.com/auth/open/connect/authorize`.
**Example authentication request**
```curl
https:///auth/open/connect/authorize
?client_id=
&redirect_uri=
&response_type=
&scope=openid%20profile
&code_challenge=ABC123
&code_challenge_method=S256
&response_mode=query
&state=12345
&nonce=678910
```
You can find the full list of available request parameters in the ['Authentication Request' section](https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest) of the OIDC documentation.
#### acr_values
You can use `acr_values` to adjust how the authentication flow behaves. There are generic parameters (listed below) that apply to all identity providers (IdPs), as well as IdP-specific parameters.
The format of the parameter is a space-separated list of key-value pairs: `acr_values=key1:value1 key2:value2`. To specify multiple values for the same key, use the comma-separated format: `acr_values=key1:value1a,value1b`.
**Example:** `acr_values=idp:idp_name,other_idp_name loa:high`
**Result:** IdP will be pre-selected for the end-user; Level of Assurance is set to *high*.
**Available parameters:**
:::CustomTable{columnWidths="25% 75%"}
| **Name** | **Description** |
|:---------|:-----------------------------------------------------------------------|
| `idp` | Defines the IdPs to use. Learn more in [IdP scoping](/docs/eid-hub/concepts/idp-scoping.mdx?protocol=oidc). This works in conjunction with `login_hint`. |
| `loa` | Specifies the eIDAS [Level of Assurance (LoA)](/docs/dashboard/glossary.mdx#level-of-assurance-loa). Allowed values: `low`, `substantial` or `high`. |
| `theme` | Specifies the theme to use. |
:::
##### Set acr_values at the client level
Typically, you define `acr_values` as a query parameter in your authorization request. However, you can also configure ACR values at the client level, thus applying specific values to all the requests by default without the need to define `acr_values` explicitly for each request.
You can configure default `acr_values` in your OIDC client in the Signicat Dashboard. To do this:
1. Navigate to **Products** > **eID and Wallet Hub** > [**OIDC client**](https://dashboard.signicat.com/oidc-clients).
2. Choose your OIDC client and select **Edit**.
3. Navigate to the **Access** tab, then edit the **ACR values** field with the values you want to use by default in all requests.
4. Optional. Tick the **Force use ACR values** box to prevent that ACR values are overridden or changed when defined as query parameters in a request.
Any ACR values you configure in the Dashboard apply now to all authentication flows by default.
Note that passing `acr_values` as a query parameter in the request overrides the default values you configure in the client in the Dashboard, unless you force the use of ACR values.
#### login_hint
You can use this `login_hint` to prefill end-user information to send to the IdP, such as the national identification number of the end-user. The format is a space-separated list of key-value pairs: `login_hint=key1:value1 key2:value2`.
**The following pre-filling options are available:**
:::CustomTable{columnWidths="50% 50%"}
| **Name** | **Description** |
| :------------------ | :------------------------------ |
| `nin` | National identification number. |
| `mobile` | Mobile phone number. |
| `dateOfBirth` | Date of birth (YYYY-MM-DD). |
| `email` | Email address. |
| `username` | Username or User ID. |
| `deviceID` | Mobile Device ID. |
| `firstName` | First name. |
| `lastName` | Last name. |
| `bankAccountNumber` | Bank account number. |
| `organisation` | Organisation name. |
:::
You can find specific configuration examples for the following eIDs here:
- [Swedish BankID](/identity-methods/sbid/integration-guide/)
- [Norwegian BankID](/identity-methods/nbid/integration-guide/)
- [SMS OTP](/identity-methods/sms-otp/setup/oidc.mdx)
- [MobileID](/identity-methods/mobileid/integration-guides/oidc/ciba-flow/implementation/#login-hint)
:::warning `login_hint` and `acr_values` field format
Note that query parameters must be URL encoded (percent encoding).
For example, if you want to prefill end-user mobile numbers with `login_hint`, use `login_hint=mobile:%2B447700900000` to represent the `+44 7700900000` phone number.
:::
### Token
To obtain an access token, an ID token and optionally a refresh token, the client sends a token request to the `token` endpoint to obtain a token response.
**Example token request**
```
curl -XPOST "https:///auth/open/connect/token" -H "Content-Type: application/x-www-form-urlencoded" -H "Authorization: Basic czZCaGRSa3FOMzpnWDFmQmFOM2JW" -d "grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https://example.com"
```
**Example token response**
```http
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{
"access_token": "eyJ ... Klmmm.emo ... NzBKFf.gaW8g ... Mzn5",
"token_type": "Bearer",
"refresh_token": "eyJ ... zcuUk.mow ... 7HmKmn.ggW8h ... Gz4g",
"expires_in": 3600,
"id_token": "eyJ ... zcifQ.ewo ... NzAKfQ.ggW8h ... Mzqg"
}
```
### UserInfo
To obtain the requested claims from the `UserInfo` endpoint, the client makes a request using an access token obtained through OpenID Connect authentication.
**Example `UserInfo` request**
```
curl -XPOST "https:///auth/open/connect/userinfo" -H "Accept: application/json" -H "Authorization: Bearer fAAdL01c6QWDbPs9HrWHz5e7nRWVAnxqTTP7i88G"
```
**Example `UserInfo` response for valid access token**
```http
HTTP/1.1200OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{
"sub": "bob"
"given_name": "Bob",
"name": "Bob Smith",
"email": "bob@mycompany.com",
"phone_number": "+1 (604) 55-555-66-777",
"address": {"formatted": "123 Main St., Anytown, TX 77777"},
}
```
## IdP scoping
IdP scoping allows you to define which eIDs to make available for authentication to your users. One advantage of IdP scoping is the ability of showing only the eIDs that are relevant to the user while hiding other eIDs active in your Signicat account.
To control which eID to make available to your end-users, you can use the `idp` key in the `acr_values` query parameter with the format `acr_values=idp:idp_name,other_idp_name`. For example, using `acr_values=idp:otp-sms,mitid` in your authorisation request will only display SMS OTP and MitID to the user.
When specifying only one eID in your request, you automatically redirect the user to the provider authentication page, thus skipping the eIDs selection screen.
To learn more about this feature and view examples for OIDC, see the [IdP scoping](/docs/eid-hub/concepts/idp-scoping.mdx?protocol=oidc) documentation.
#### Restrict IdPs at the OIDC client level
In the Dashboard, you have the option to restrict the eIDs (active in your account) that a specific OIDC client can access. This applies when you have several OIDC clients that you use for different purposes and applications and you want to restrict the eIDs available for an OIDC client.
To restrict the eIDs available for an OIDC client, do the following:
1. In the Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients).
2. Choose your OIDC client and select **Edit**.
3. Navigate to the **Access** tab, then enter the eIDs in the **Identity provider restrictions** field.
Now, only the specified IdPs are available for authentication requests with this OIDC client.
## Error codes
To learn more about error codes and their meanings, see [OIDC error codes](/docs/eid-hub/oidc/oidc-error-codes/).
## Single sign-on (SSO)
[Single sign-on (SSO)](/docs/dashboard/glossary.mdx#single-sign-on-sso) allows the end-user to establish their identity once without having to re-authenticate every time they access your services.
:::note Levels of SSO
Signicat supports two levels of SSO, at the OIDC server and the eID and Wallet Hub level.
This page describes only SSO at the OIDC server level. For more information about SSO at the eID and Wallet Hub level, see this [page](/docs/eid-hub/concepts/single-sign-on.mdx).
:::
#### How it works
When the end-user first logs in with SSO, the Signicat OIDC server sets, and stores, an encrypted cookie that contains information about the end-user's device. Note that the SSO scope is set at the (Signicat) account level.
On subsequent logins, the Signicat OIDC server checks whether an SSO cookie is present in the user's browser. If found, the Signicat OIDC server verifies the SSO cookie validity and lifetime.
If a cookie is valid and approved, the end-user is automatically redirected to your application without being asked to re-authenticate.
#### SSO in the Dashboard
When you create a new OIDC client, SSO is enabled by default.
You can control the cookie lifetime with the **User SSO lifetime** setting. The default value is `3600` seconds (1 hour).
To change the SSO session lifetime:
1. In the Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients).
2. Select **Edit** next to your client to view the client configuration.
3. Navigate to the **Advanced** > **Lifetimes** tab.
4. Edit the **User SSO lifetime** setting.
5. Select **Update** to save and apply the changes.
#### Forcing re-authentication
To force the end-user to re-authenticate, specify the URL parameter `prompt=login` in the authorisation request.
:::note Maximum Authentication Age (`max_age=0`)
When forcing re-authentication, avoid using `max_age=0` as an alternative to `prompt=login`.
:::
## Single log-out (SLO)
Single log-out (SLO) is a feature that allows the end-user to sign out of multiple authenticated sessions with a single action.
Signicat implements the [OpenID Connect RP-Initiated Logout 1.0](https://openid.net/specs/openid-connect-rpinitiated-1_0.html) standard for end-user logout.
:::warning OIDC level only
At the moment, the end-user will **only** be logged out of Signicat OIDC server. Any other potential SSO session at the application, IdP or eID and Wallet Hub level will not be terminated (logout).
:::
#### Example of logout
To initiate logout you need to direct the end-user to the `/auth/open/connect/endsession` endpoint, as shown in the following example:
```sh
https:///auth/open/connect/endsession?post_logout_redirect_uri=https://signicat.com&id_token_hint=eyJhb...QifQ...hLVNI8Q
```
You can customise the logout process by specifying the following query parameters:
- `id_token_hint` (recommended). It's necessary to identify the end-user you want to log out. It should contain a valid ID Token as described in the next section.
- `post_logout_redirect_uri` (optional). The URI you provide in the request must match the URI configured in the **Post Logout Redirect URI** setting of your OIDC client in the Dashboard.
#### Providing an ID token
If you initiate a logout request *without* providing a valid ID token the end-user will be presented with a web page that prompts them to log out, instead of automatically logging them out.
The ID token provides the context necessary to log out the end-user in an automated way. Without this information, it is not possible to link the client and the end-user logout request. Therefore, without a valid ID token the end-user has to submit their consent to log out.
This also means you cannot use **Post Logout Redirect URI** or **Automatic Redirect to Logout Url** functionality.
#### Automatic redirect after logout
After the end-user logs out, you can automatically redirect the end-user to a specific URL. You can control where to redirect the end-user with the **Post Logout Redirect URI** setting.
For security reasons, you need to meet the following conditions:
- Provide valid `id_token_hint` and `post_logout_redirect_uri` in the request.
- Enable **Automatic Redirect to Logout Url** in the URIs configuration of your OIDC client in the Dashboard.
Without these conditions the end-user gets redirected to a default confirmation logout screen.
## Finnish Trust Network (FTN) specifics
### Message Level Encryption (MLE)
Due to requirements from Traficom, you must use *Full Message-Level Encryption* (MLE) for authentication with FTN.
There are two different ways to achieve this. The first is required and the second is only required in certain circumstances:
1. Receiving encrypted responses from Signicat (required)
2. Sending encrypted requests to Signicat (optional)
:::warning Important
If you are sending **personally identifiable information (PII)** as part of your request, you must also send encrypted *requests*.
:::
Both these mechanisms are described in [Advanced security considerations](/docs/eid-hub/oidc/advanced-security/).
### Authentication request signing
Due to requirements from Traficom, you must sign the authentication requests when setting up FTN with the OIDC protocol.
For details on how to do this, see the [Encryption/signing of the request object](/docs/eid-hub/oidc/advanced-security/send-encrypted-signed-requests/) section.
:::tip PAR as an alternative
The Pushed Authorization Requests (PAR) extension is accepted as an alternative to signing the authentication request. For more details about PAR, see the [Pushed Authorization Requests (PAR)](/docs/eid-hub/oidc/advanced-security/pushed-authorization-requests-par/) section.
:::
## External references
### OpenID Connect
- [OpenID Connect Core 1.0](https://openid.net/specs/openid-connect-core-1_0.html)
- [OpenID Connect Discovery 1.0](https://openid.net/specs/openid-connect-discovery-1_0.html)
- [OpenID Connect Session Management 1.0 _draft 28_](https://openid.net/specs/openid-connect-session-1_0.html)
- [OpenID Connect Front-Channel Logout 1.0 _draft 02_](https://openid.net/specs/openid-connect-frontchannel-1_0.html)
- [OpenID Connect Back-Channel Logout 1.0 _draft 04_](https://openid.net/specs/openid-connect-backchannel-1_0.html)
### OAuth 2.0
- [OAuth 2.0 - RFC 6749](https://tools.ietf.org/html/rfc6749)
- [OAuth 2.0 Bearer Token Usage - RFC 6750](https://tools.ietf.org/html/rfc6750)
- [OAuth 2.0 Multiple Response Types](https://openid.net/specs/oauth-v2-multiple-response-types-1_0.html)
- [OAuth 2.0 Form Post Response Mode](https://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html)
- [OAuth 2.0 Token Revocation - RFC 7009](https://tools.ietf.org/html/rfc7009)
- [OAuth 2.0 Token Introspection - RFC 7662](https://tools.ietf.org/html/rfc7662)
- [Proof Key for Code Exchange - RFC 7636](https://tools.ietf.org/html/rfc7636)
- [JSON Web Tokens for Client Authentication - RFC 7523](https://tools.ietf.org/html/rfc7523)
- [OAuth 2.0 Device Authorization Grant - RFC 8628](https://tools.ietf.org/html/rfc8628)
---
## Test connections(Oidc)
This page describes how you can test an authentication with OpenID Connect using [**OAuth Tools**](https://oauth.tools/), a public web application to test and experiment with OIDC flows.
For testing purposes, this guide shows steps to complete an Authorization Code Flow using Norwegian BankID. However, you may easily adapt the instructions to test all the other eIDs available in the Signicat eID and Wallet Hub.
Additionally, you can find eID-specific test guides in the respect [eID documentation](/identity-methods/).
:::tip Sandbox account
We recommend you run test authentications by using a sandbox account.
:::
## Initial preparations
Before you can run a test authentication, make sure to complete the following configuration in the Signicat Dashboard.
:::tip New customers
If you are new to Signicat, we recommend you first read the [Get started with Signicat](/docs/) page.
:::
### 1. Add an eID
To add an eID to your Signicat account, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. Click **+ Add new** in the top right.
3. Choose the eID from the list. Then, fill in any required configuration and click **Add**.
4. Now, review that the eID is available and displayed as "Active" in the eIDs page.
### 2. Create an OIDC client
You need to create an OIDC client with the relevant scopes. To do this:
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients).
2. Click **Create client**.
3. In the **Primary Grant Type** field, select **AuthorizationCode** from the dropdown menu.
4. In the **Client name** field, give your client a name.
5. In the **Redirect URI** field, set `https://oauth.tools/callback/code`.
6. In the **Scope field**, set `profile` and `nin`, in addition to `openid`. Optionally, you may add more attributes depending on what user data the eID supports.
### 3. Add a secret
To add a secret to your OIDC client, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select **Edit** next to your client name.
3. In the client menu, go to the **Secrets** tab, then select **Add secret**.
4. Enter a name for your client secret, then select **Generate secret**.
## Test connection
You can test an authentication by importing your OIDC client inside the OAuth Tools environment.
### 1. Import your client in OAuth Tools
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients).
2. Click the **Edit** button beside your new OIDC client.
3. Select the **Overview** tab, then click **Try out this client on oauth.tools!**.
### 2. Configure Signicat Playground settings
:::tip First time only
You only need to configure the Signicat Playground settings the first time you use OAuth Tools. After that, your configuration will be cached and available for future tests.
:::
1. In OAuth tools, expand the dropdown menu beside **Signicat Playground**, then select **Settings**.
2. On the **Endpoints** tab, verify that the contents of the **Metadata URL** in OAuth Tools matches the contents of the **Well-Known URL for client** field in the Signicat Dashboard. When you enter the URL, click **Discover** to fetch the other endpoints.
:::info Where can I find this?
To find the **Well-Known URL for client** field in the Signicat Dashboard:
1. Go to **Signicat Dashboard** > **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients).
2. Click the **Edit** button beside your new OIDC client.
3. In the **Overview** tab, locate the **Well-Known URL for client** field. This is `https:///auth/open/.well-known/openid-configuration`
:::
3. On the **Clients** tab, verify that your client is visible, and that the **Code** toggle button is enabled.
4. Close the settings page.
### 3. Configure Authorization Code Flow settings
1. In the left-side menu, select **Authorization Code**.
2. In section **(1) Settings**, set the following:
:::CustomTable{columnWidths="25% 75%"}
| **Field name** | **Allowed values** |
| :-- | :-- |
| Select or enter a client ID | Use the dropdown menu to select your client. |
| Select or add scope | Use the dropdown menu to set scopes. `openid` is mandatory. Set other scopes that as configured in your OIDC client, for example `profile`, `nin`. |
| Select or add acr value | Optional. To route directly to Norwegian BankID and skip the eID selection screen, enter `idp:nbid`. Learn more about [ACR values](/docs/eid-hub/oidc/oidc-implementation/#acr-values). |
| Select or add locale | Optional. Enter your desired language. For example, `en` or `no`. |
| Prompt parameter | Optional. Use the dropdown menu to set prompt `login`. |
| Login Hint | Optionally, you can set a [Login hint](https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest). |
:::
### 4. Start flow
1. In section **(2) Start Flow**, click the **Run** button. This will redirect you to the Norwegian BankID portal.
2. Optional. If you have activated many eIDs in the Signicat Dashboard and you have left the ACR values empty, you will be redirected to the **Select identity provider** screen. To proceed, choose **Norwegian BankID**.
3. In the Norwegian BankID portal, use the following test credentials:
| National ID | OTP | Password |
|:------------- |:----- |:---------- |
| `01100844350` | `otp` | `qwer1234` |
| `10103933108` | `otp` | `qwer1234` |
:::tip Test users for Norwegian Bank ID
Pre-generated test users for Norwegian BankID may become unavailable after a series of failed attempts. If this happens, you can [generate more test users](/identity-methods/nbid/test.mdx#order-test-user).
:::
4. Upon successful authentication, Norwegian BankID redirects to the Redirect URI of your OIDC client. This is `https://oauth.tools/callback/code`.
3. In OAuth Tools, in **(3) Redeem Authorization Code**, click **Redeem Code**.
After you redeem the authorisation code, you will find the **Access Token** and the **ID Token** in the pane on the right-hand side. In particular, the **ID Token** > **Payload** contains the JSON with the personal information of the end-user.
**Payload example**
```json
{
"iss":"https:///auth/open",
"nbf":1780326261,
"iat":1780326261,
"exp":1780326861,
"aud":"",
"amr":["external"],
"at_hash":"WSabMjkG...coOtemlQClQ",
"sid":"2D27D47B593142CD747F821ED20E7330",
"sub":"mVyIHdx-vovALfhWgoVs...Hzbknv0BNH9AcIxZHhI4=",
"auth_time":1780326258,
"idp":"nbid",
"nin":"01100844350",
"nin_type":"BIRTH",
"nin_issuing_country":"NO",
"idp_issuer":"https://auth.current.bankid.no/auth/realms/current",
"transaction_id":"8612c10c-30dd-0449-bc5e-25a3f8fdc47e",
"sandbox":true,
"acr":"high"
}
```
### 5. Call Userinfo endpoint
:::tip Optional endpoint
The `UserInfo` endpoint is part of the [OpenID Connect standard (OIDC) specification](https://openid.net/specs/openid-connect-core-1_0.html#UserInfo) and is designed to return claims about the authenticated user.
:::
1. In the left-side menu, select **Userinfo**.
3. In section **(1) Settings**, select **Authorization Code Flow: Access Token** from the dropdown menu.
4. Click the **Call Userinfo Endpoint** button.
5. The Userinfo is shown in the pane on the right-hand side.
:::info Success!
You have now tested an OIDC authentication flow using your OIDC client.
You can explore more flow types and additional OIDC functionality on the [https://oauth.tools/](https://oauth.tools/) website.
:::
---
## Quick start guide(Quick-start)
# Quick start guide
Learn how to identify your end-users in a few steps.
This quick start guide shows you how to:
1. Activate an eID in the Signicat Dashboard.
2. Test an authentication flow.
3. Configure an authentication protocol.
4. Initiate an authentication flow with a protocol.
:::note Note
For illustration purposes, we use Norwegian BankID as an example eID. The same steps apply to the other eIDs supported by Signicat.
:::
## Prerequisites
If you do not have an account already, then you need to sign up to the Signicat Dashboard for free and complete the initial preparations. To do this:
1. Sign up to the [Signicat Dashboard](https://login.signicat.com/ownidp/web/registration) and register your profile.
2. Ensure that you have created an [organisation](/docs/dashboard/organisation-management/organisations.mdx).
3. Create an [account](/docs/dashboard/organisation-management/accounts.mdx). To do this:
1. Go to **Signicat Dashboard** > [**Organisation**](https://dashboard.signicat.com/org-mgmt/), then select **+ Add account**.
2. Enter an account name, choose the type of account that you want to create, then select **Create**.
4. Create a [domain](/docs/dashboard/organisation-management/domains/). To do this:
1. Go to **Signicat Dashboard** > **Settings** > [**Domains**](https://dashboard.signicat.com/domains/), then select **+ Add domain**.
2. To create a standard domain, enter a domain name. Then, select **Add domain**.
3. To create a custom domain, follow the instructions in the [Custom domains](/docs/dashboard/organisation-management/domains/custom/) documentation.
:::tip Account types
We recommend that you create a sandbox account to test our services before going live. Sandbox and production accounts must be set up separately.
:::
:::info Domains and eIDs
For this guide you can use a standard Signicat domain.
It is important to note that certain eIDs may require you to add digital SSL certificates and custom domains for security purposes. You can learn more in the [eID-specific documentation](/docs/eid-hub/e-ids/).
:::
## Add an eID in the Dashboard
First, you need to add and activate the eID in your Signicat account. To do this:
1. In the Signicat Dashboard, go to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. To add a new eID, select **Add new** in the top right.
3. Choose _Norwegian BankID_ from the list. To activate it, click **Add**.
Now, you can view _Norwegian BankID_ set as "Active" in the list of eIDs.
:::note Production account
To activate an eID in a production account, you may need to first complete additional procedures. Learn more about these requirements in the [eID-specific documentation](/docs/eid-hub/e-ids/).
:::
## Test the eID
Once you have activated an eID, you can already run a test authentication flow, directly from the Signicat Dashboard. Testing helps you to better understand the user experience with an eID.
To test an authentication flow in the Signicat Dashboard, do the following:
1. Go to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
2. Select **Test eIDs** at the top right.
3. Optional: When more than one eID is active in your account, a list with all your eIDs is displayed by default. Choose _Norwegian BankID_.
4. Follow the steps on the Norwegian BankID site to authenticate with the following test credentials:
- National ID number: `01100844350` or `10103933108`
- One Time Code: `otp`
- BankID password: `qwer1234`
:::tip Test users for Norwegian BankID
Pre-generated test users for Norwegian BankID may become unavailable after a series of failed attempts. If this happens, you can [generate more test users](/identity-methods/nbid/test.mdx#order-test-user).
:::
5. Review the user data attributes returned by BankID.
Once you have completed a test authentication, we display the user attributes of your test user.
## Connect with an authentication protocol
The Signicat eID and Wallet Hub provides authentication *as a service*, thus acting as the single point of integration between your application and a selection of eIDs. To authenticate your end-users, you connect your application to the eID and Wallet Hub using an authentication protocol.
:::note The role of Signicat
Note that you only need to connect to the eID and Wallet Hub servers. In the background, Signicat handles the connection to the eIDs separately, therefore acting as a message broker between your application and the eIDs.
:::
### Choose a protocol
The eID and Wallet Hub supports the following authentication protocols:
- [OpenID Connect (OIDC)](/docs/eid-hub/oidc/)
- [SAML 2.0](/docs/eid-hub/saml-2-0/)
- [Signicat's Authentication REST API](/docs/eid-hub/authentication-api/)
When you build your integration, you need to implement your connection with one of these protocols.
:::details Choosing a protocol
You should choose a protocol based on what you prefer, what your application supports and what you want to achieve.
OIDC and SAML are official identity standards, while the Authentication REST API is a solution developed and maintained by Signicat.
The Signicat [Authentication REST API](/apis/eid-hub/) offers a lot of flexibility and supports _headless_ and _redirect_ integration flow(s) (grant type).
If you want to use an official identity protocol, we recommend using OIDC. When choosing, consider the following:
- SAML 2.0 is much more complex to implement on your side since it relies on XML schemas to transmit user information and usually requires a federation agent already in place.
- OIDC is an industry standard that only focuses on authentication and based on the OAuth 2.0 standard. You send direct calls between services using REST and JSON, accessible through APIs. With OIDC you do not need to manage user sessions on your own (like with the Authentication REST API).
:::
## Build a connection
To understand how to connect with an authentication protocol, select the corresponding tab below.
OpenID Connect (OIDC)
The following sections describe how to set up authentication with OIDC. Instructions are generic and agnostic of any programming language. For a more detailed guide with language-specific examples, see the [Code examples for OIDC](/docs/eid-hub/oidc/code-examples/).
To get started with OIDC, follow these steps:
1. Register an OIDC client in the Signicat Dashboard
2. Find your Discovery and issuer URL
3. Build an authentication request
You can find more details about each step below.
1. Register an OIDC client
Before you can start authenticating users, you must register an OIDC client application in the Signicat Dashboard. An OIDC client comes with a **Client ID**. Depending on the authentication grant type (flow) you want to implement, you may associate a secret to the client.
To register your OIDC client application in the Signicat Dashboard, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select **Add client**.
3. Configure your OIDC client with these settings:
- **Primary grant type**: Choose the grant type you want to implement. We strongly recommend **AuthorizationCode** (Authorization Code flow). Learn more about OIDC grant types in the to the [OIDC specification](https://openid.net/specs/openid-connect-core-1_0.html#Authentication) and the [OAuth 2.0 specification](https://oauth.net/2/grant-types/).
- **Create client from template**: Optional. Allows you to use a template to prefill your client configuration. Skip this if you want to customise your configuration.
- **Client name**: Enter a name for the client.
- **Redirect URI**: Enter the URL where you want to redirect your end-user after they authenticate with an eID. Note that you can add several redirect URIs after you create the client.
- **Scope**: Select the scopes for the type of data you want to retrieve with this client. `openid` is mandatory. `profile` and `nin` are necessary in most cases. You can see the definition of `profile` and other predefined scopes in the [OIDC specification](https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims). You find scope definitions in the specific [eIDs](/docs/eid-hub/e-ids/) documentation.
4. Select **Create** to create the new client.
Congratulations, you have created an OIDC client!
2. Find your Discovery and issuer URL
Depending on how you want to implement your app, you can find:
- The discovery URL: `https:///auth/open/.well-known/openid-configuration`. For example, if your domain is `https://verybigcorp.signicat.com`, your discovery URL is `https://verybigcorp.signicat.com/auth/open/.well-known/openid-configuration`.
- The issuer URL: `/auth/open/`. For example, your issuer URL would be `https://verybigcorp.signicat.com/auth/open/`.
3. Build an authorisation request
To start authenticating your end-users, your application must direct them to the authorisation endpoint (`https:///auth/open/connect/authorize`) with the appropriate parameters.
At a minimum, your OIDC authorisation request must include:
- **client_id**: The unique ID of your OIDC client that you registered in the Signicat Dashboard.
- **response_type**: The OAuth response type that determines the authorisation flow and response parameters. Use `code` for the Authorization Code flow.
- **redirect_uri**: The URL of your website or application where Signicat redirects end-users after they authenticate.
- **scope**: Must include `openid` and any other scopes for attributes that the eID supports.
- **state**: A random value that protects your application against Cross-Site Request Forgery (CSRF).
- **nonce**: A random value to secure the integrity of your ID token. You need to compare the returned `nonce` claim with the value sent in the request.
- **prompt**: Optional. Forces your end-users to re-authenticate every time, bypassing any active Single Sign-On (SSO) cookies or sessions.
Example authorisation request (line breaks included for readability):
```http
https:///auth/open/connect/authorize?
&client_id=sandbox-example-client-123
&response_type=code
&redirect_uri=https://myservice.example/redirect
&scope=openid
&acr_values=
&state=af93kslz
&nonce=bn28sjdp
&prompt=login
```
Your next steps depend on the type of OIDC flow you want to use. After your end-users authenticate, you can retrieve the results from the **ID token** and from the **UserInfo** endpoints.
Next steps
This guide introduced how the eID and Wallet Hub works in a nutshell. Next, we recommend learning more about OIDC and exploring the eIDs documentation.
* [**OIDC**](/docs/eid-hub/oidc/): Find out more about OIDC, the authentication protocol based on the OAuth 2.0 protocol
* [**Supported eIDs**](/identity-methods/): View and learn how to integrate with the eIDs
SAML 2.0
This guide explains how you can exchange XML metadata files with Signicat to set up a SAML 2.0 connection. To learn more about integrating using SAML 2.0, see [Set up SAML](/docs/eid-hub/saml-2-0/saml-metadata.mdx).
How to exchange SAML metadata
To set up a secure connection over SAML, you must provide Signicat with a metadata file.
:::info What is in the SAML metadata file?
A metadata file contains information about the service provider (SP) and the identity provider (IdP) involved in an authentication process. For example, the metadata stores the URL of the server where to send the response after the authentication session.
:::
To integrate your application with Signicat using SAML 2.0, you configure the metadata in the Signicat Dashboard. You can choose between these configuration options:
- **Dynamic with URL**: You host the metadata in your server and share the metadata URL with Signicat.
- **Static with Form**: You upload the metadata file in the Signicat Dashboard. If you don't have a metadata, you can fill in a form in the Dashboard and have Signicat generate (and store) the metadata file.
To configure a dynamic metadata URL in your account, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**SAML 2.0**](https://dashboard.signicat.com/bca/sp/) and select **Add new**.
2. Select the **URL** configuration method.
3. Fill in the configuration. You can find information about the fields in the table below.
4. Select **Add** to save the configuration.
5. To download the Signicat metadata file in XML format, select **Get Signicat's metadata**.
URL configuration fields
:::warning Registering a new Metadata URL
To fetch your metadata file, we first need to check that the URL is safe. Before adding a new Metadata URL, please contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
Required fields are marked with an asterisk (\*).
:::CustomTable{columnWidths="25% 75%"}
| Field name | Description |
|:-------------------------------|:------------|
| Name\* | Name of the connection. |
| Application URL | URL of your application. |
| Metadata URL\* | The web address where you host the metadata. |
| Select a LoA contract\* | Select the mapping between levels of assurance that must apply to this configuration. LoA contracts can be configured under **Level of assurance contracts**. |
| Select attribute filter | Select an attribute filter to control which attributes you want to include, or exclude, from the response. To create attribute filters in the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**Attribute filters**](https://dashboard.signicat.com/bca/attribute-filters). |
| Response attribute mapping | You can choose to customise the name of the attributes received in the response body. |
:::
:::tip Advanced configuration
Learn more about advanced configuration in the [URL configuration](/docs/eid-hub/saml-2-0/saml-metadata.mdx#add-url-configuration) section of the SAML 2.0 documentation.
:::
To configure a static metadata Form in your account, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**SAML 2.0**](https://dashboard.signicat.com/bca/sp/) and select **Add new**.
2. Select the **Form** configuration method.
3. If you've already created your metadata file, upload it here. If not, create the metadata using the form fields described in the table below.
4. Select **Add** to save the configuration.
5. To download the Signicat metadata file in XML format, select **Get Signicat metadata**.
Form configuration fields
Required fields are marked with an asterisk (\*).
:::CustomTable{columnWidths="25% 75%"}
| Field name | Description |
|:-------------------------------|:------------|
| Name\* | Name of the connection. |
| Application URL | URL of your application. |
| Entity ID\* | Unique identifier for the connection. |
| Select a LoA contract\* | Select the mapping between levels of assurance that must apply to this configuration. See [Level of Assurance contracts](/docs/eid-hub/saml-2-0/saml-loa-contracts.mdx) for more information. |
| Want assertions signed | If ticked, assertions will be signed. |
| Use a transient format for the NameID | Tick this box if you only want a transient NameID.|
| Include the SAML Assertion of the IdentityProvider if available | If the eIDs that you use are SAML-based, you may opt to receive the original SAML assertion of the eID. |
| Encrypt assertion | If you want to receive an `EncryptedAssertion` instead of an `Assertion` for added security, select this option. Note that some eIDs require you to receive an `EncryptedAssertion`. |
| Assertion consuming services\* | At least one assertion consuming service must be configured. Provide a location URL and a binding type (`REDIRECT`, `POST` or `ARTIFACT`). |
| Single logout services | Enter the location URL and binding type (`REDIRECT`, `POST` or `ARTIFACT`) of any applicable single logout services. |
| Artifact resolution services | Enter the location URL, binding type and index of any applicable artifact resolution services. |
| Attribute consuming services | Enter name, index, description (optional) and at least one attribute |
| Certificate\* | Upload all relevant certificates for the connection (at least one). Information about the certificates, such as issuer and expiration date, is displayed when they are uploaded. |
| Client organisation | Enter organisation name, display name, and URL. |
| Hosting party organisation | Provide organisation name, display name, and URL. |
| Contact people | Provide details about the contact people in your organisation. In **Type of contact person**, specify whether they are part of support, a technical department, name, phone number, and more. |
| Response attribute mappings | You can customise the name of the attributes received in the response body. You can provide none or many name-to-name mappings. |
| Select attribute filter | Select an attribute filter to control which attributes you want to include, or exclude, from the response. To create attribute filters in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**Attribute filters**](https://dashboard.signicat.com/bca/attribute-filters). |
| Select default eID rule | Select which eID rule to use by default. To add eID rules in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**eID Rules**](https://dashboard.signicat.com/bca/eid-rules/). |
:::
:::tip Advanced configuration
Learn more about advanced configuration in the [Form configuration](/docs/eid-hub/saml-2-0/saml-metadata.mdx#add-form-configuration) section of the SAML 2.0 documentation.
:::
Metadata file example
Here is an example of a SAML 2.0 metadata file:
```xml
XML_SIGNATURE
KEY_NAME
X509_ENCODED_CERTIFICATE
ORG_NAMEORG_DISPLAY_NAMEORG_URL
```
After you have configured the SAML metadata in the Dashboard, you are ready to initialise a request for end-user authentication.
SAML authentication examples
When the end-user wants to authenticate to your services over a SAML connection, the service provider (your app) and the identity provider communicate by sending:
1. A request: `AuthnRequest`
2. A response: `AuthnResponse`
Below, you can find examples of requests and responses. For more examples, see the [SAML examples](/docs/eid-hub/saml-2-0/saml-examples.mdx).
AuthnRequest example
The SAML `AuthnRequest` can be simple. You can always add more information in the request, but the request can be as minimal as the following example (POST binding):
```xml
ENTITY_ID
XML_SIGNATURE
```
The SAML `AuthnRequest` request needs to be encoded for transmission. Usually, it's compressed, then Base64-encoded and finally URL-encoded. Many SAML libraries handle this automatically.
Example authorisation URL
To initiate an authentication flow using SAML, you typically redirect the end-user to the authorisation URL. Depending on the SAML binding, you send the request in a different format. For example, for POST binding you can generate an authorization URL like this:
```curl
POST https:///auth/saml/login
```
and pass the following in the body of the request:
- `SAMLRequest` is your encoded `AuthnRequest` request.
- `RelayState` is optional and can be used to retain state information to return to after authentication.
AuthnResponse example
Example of a SAML response `AuthnResponse` after the end-user logged in with eHerkenning:
```xml
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
XML_SIGNATURE
https:/*YOUR_SIGNICAT_DOMAIN*/auth/saml
XML_SIGNATURE
k5QDBPNavooSgsxQNCITxSnQc5oo37cqev726-Iz1-Y=ENTITY_IDGerarda Josephina KierkegaardGerarda JosephinaKierkegaardemail@example.com03659FB1FAE5D26DB2D28866C1A4FE7F4E1CD5E62DD2552EE3D3B11D4C27163D@9162F54B3B07284AC4E147A849DEAEE424444001819935177urn:etoegang:DV:00000003244440010000:services:9121cf1c1457-cc97-4b47-a324-25d1a97db3cb24444002SignicatIntermediaryurn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransporturn:etoegang:HM:00000003244440010000:entities:9713
```
Next steps
This guide introduced how the eID and Wallet Hub works in a nutshell. Next, we recommend learning more about SAML 2.0 and exploring the eIDs documentation.
* [**SAML 2.0**](/docs/eid-hub/saml-2-0/): Find out more about SAML, an XML-based standard for exchanging authentication and authorisation data between security domains.
* [**Supported eIDs**](/identity-methods/): View and learn how to integrate with the eIDs
Authentication REST API
The Authentication REST API allows you to connect to the eID and Wallet Hub and perform end-user identity verification and authentication through a REST API, where all request and response bodies are formatted in JSON.
Initial preparation
The Authentication REST API supports the OAuth 2.0 *client credentials* grant flow: you first exchange a client ID and a secret for an access token, then use the access token to authenticate the requests to the API endpoints.
To learn how to connect to this API, follow steps 1-3 in the **Connect to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::note What permissions are required?
Ensure that you set permission **Authentication REST API** for your API client.
:::
Import the Postman collection
You can make calls to the Authentication REST API using our Postman collection.
:::tip Testing only
Note that Postman is a tool for testing and learning about APIs. You should not rely on Postman in production.
:::
You can fork or import the Postman collection by clicking the button below:
[](https://app.getpostman.com/run-collection/20756027-56b06e30-202c-43b6-8838-3eb0007ebb39?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D20756027-56b06e30-202c-43b6-8838-3eb0007ebb39%26entityType%3Dcollection%26workspaceId%3D3ea7a3cf-7777-4f42-b4e9-88876cfe660d)
To start using the Postman collection, do the following:
1. Fork or import the Postman collection.
2. Open Postman and select the **Signicat Authentication REST API** collection.
3. In the Variables tab, edit the following variables:
- `baseURL`: The base URL of the API. Set this to: `https://api.signicat.com/auth/rest`.
- `oauth_scope`: The scope. Set this to: `signicat-api`.
- `oauth_client_id`: The client ID of your API client. For example, this looks like `dev-red-pin-123`.
- `oauth_client_secret`: The client secret associated to your API client.
- `oauth_url`: The Authorisation URL. Set this to: `https://api.signicat.com/auth/open/connect/token`.
4. Save your variables by clicking the save icon or pressing Ctrl+S.
Now, you are ready to obtain an access token using the variables you defined above.
Obtain an access token
To authorise requests to the API, you need to send an access token in your request. To obtain the access token with the Postman collection, do the following:
1. Select the Authorization tab.
2. Scroll to the bottom and select **Get New Access Token**.
3. If the request was successful, review the Access Token and select **Use Token**.
You have now obtained a token to authenticate to the API. When calling an API endpoint, you supply the access token in the HTTP `Authorization` header of your request. You can always review your token in **Authorization > Token**.
**Note:** Tokens have a default expiry date. If a token expires, repeat the steps above to request a new token.
Create an authentication session
To begin an authentication flow, your app needs to direct the end-user to an eID, such as Norwegian BankID. To obtain the authorization URL where to redirect the end-user to authenticate, you send a POST request to the **Create a new session** endpoint with the appropriate parameters in the body of the request.
The body of the request might look like this:
```json
{
"flow": "redirect",
"requestedAttributes": [
"name",
"dateOfBirth",
"nin",
],
"callbackUrls": {
"success": "https://example.com/success",
"abort": "https://example.com/abort",
"error": "https://example.com/error"
},
"allowedProviders": [
"nbid"
],
}
```
To begin an authentication flow using the Postman collection, do the following:
1. In the left menu, expand the collection and select the **Create a new session** endpoint.
2. In the endpoint window, select **Send** to send the request.
3. In the response window, select the **Body** tab to view the response payload.
4. Copy and paste the `authenticationUrl` link in your browser to start an authentication session with the eID. In this case, Norwegian BankID.
When adding login to your application, you will redirect the end-user to the `authenticationUrl`.
Authenticate the end-user
You need a test user to complete the authentication. For example, you can use the following credentials for Norwegian BankID:
:::CustomTable{columnWidths="33% 33% 33%"}
| National identity number | One-time password | Password |
| :----------------------- | :---------------- | :--------- |
| `01100844350` | `otp` | `qwer1234` |
| `10103933108` | `otp` | `qwer1234` |
:::
:::tip Test users for Norwegian BankID
Pre-generated test users for Norwegian BankID may become unavailable after a series of failed attempts. If this happens, you can [generate more test users](/identity-methods/nbid/test.mdx#order-test-user).
:::
After completing the authentication flow, you can retrieve the response from successful authentication.
Get the authentication session status
When using the API, you can check the status of the authentication session at any stage. When the end-user authenticates successfully, you receive the user data attributes in the response. To do this:
1. In the left menu, expand the **id** folder and open the **Get session status** endpoint.
2. To check the session status, select **Send**. This sends an HTTP GET request using the session ID obtained from the **Create a new session** endpoint.
3. Inspect the response in the **Body** tab of the response window.
If the authentication was successful (`"status": "SUCCESS"`), you find the end-user data attributes in the `subject` field.
You have now completed an authentication flow using the Authentication REST API!
Next steps
This guide introduced how the eID and Wallet Hub works in a nutshell. Next, we recommend learning more about the Authentication REST API and exploring the eIDs documentation.
* [**Authentication REST API**](/docs/eid-hub/authentication-api/): Find out more about the Signicat Authentication REST API which enables you to easily and securely authenticate your end-users.
* [**Supported eIDs**](/identity-methods/): View and learn how to integrate with the eIDs
For information about the available endpoints and properties, as well as sample requests and responses, see the Authentication REST API reference:
* [**Authentication REST API**](/apis/eid-hub/): Configure your Authentication REST API
---
## Oidc
OpenID Connect (OIDC)
The following sections describe how to set up authentication with OIDC. Instructions are generic and agnostic of any programming language. For a more detailed guide with language-specific examples, see the [Code examples for OIDC](/docs/eid-hub/oidc/code-examples/).
To get started with OIDC, follow these steps:
1. Register an OIDC client in the Signicat Dashboard
2. Find your Discovery and issuer URL
3. Build an authentication request
You can find more details about each step below.
1. Register an OIDC client
Before you can start authenticating users, you must register an OIDC client application in the Signicat Dashboard. An OIDC client comes with a **Client ID**. Depending on the authentication grant type (flow) you want to implement, you may associate a secret to the client.
To register your OIDC client application in the Signicat Dashboard, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**OIDC clients**](https://dashboard.signicat.com/oidc-clients/).
2. Select **Add client**.
3. Configure your OIDC client with these settings:
- **Primary grant type**: Choose the grant type you want to implement. We strongly recommend **AuthorizationCode** (Authorization Code flow). Learn more about OIDC grant types in the to the [OIDC specification](https://openid.net/specs/openid-connect-core-1_0.html#Authentication) and the [OAuth 2.0 specification](https://oauth.net/2/grant-types/).
- **Create client from template**: Optional. Allows you to use a template to prefill your client configuration. Skip this if you want to customise your configuration.
- **Client name**: Enter a name for the client.
- **Redirect URI**: Enter the URL where you want to redirect your end-user after they authenticate with an eID. Note that you can add several redirect URIs after you create the client.
- **Scope**: Select the scopes for the type of data you want to retrieve with this client. `openid` is mandatory. `profile` and `nin` are necessary in most cases. You can see the definition of `profile` and other predefined scopes in the [OIDC specification](https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims). You find scope definitions in the specific [eIDs](/docs/eid-hub/e-ids/) documentation.
4. Select **Create** to create the new client.
Congratulations, you have created an OIDC client!
2. Find your Discovery and issuer URL
Depending on how you want to implement your app, you can find:
- The discovery URL: `https:///auth/open/.well-known/openid-configuration`. For example, if your domain is `https://verybigcorp.signicat.com`, your discovery URL is `https://verybigcorp.signicat.com/auth/open/.well-known/openid-configuration`.
- The issuer URL: `/auth/open/`. For example, your issuer URL would be `https://verybigcorp.signicat.com/auth/open/`.
3. Build an authorisation request
To start authenticating your end-users, your application must direct them to the authorisation endpoint (`https:///auth/open/connect/authorize`) with the appropriate parameters.
At a minimum, your OIDC authorisation request must include:
- **client_id**: The unique ID of your OIDC client that you registered in the Signicat Dashboard.
- **response_type**: The OAuth response type that determines the authorisation flow and response parameters. Use `code` for the Authorization Code flow.
- **redirect_uri**: The URL of your website or application where Signicat redirects end-users after they authenticate.
- **scope**: Must include `openid` and any other scopes for attributes that the eID supports.
- **state**: A random value that protects your application against Cross-Site Request Forgery (CSRF).
- **nonce**: A random value to secure the integrity of your ID token. You need to compare the returned `nonce` claim with the value sent in the request.
- **prompt**: Optional. Forces your end-users to re-authenticate every time, bypassing any active Single Sign-On (SSO) cookies or sessions.
Example authorisation request (line breaks included for readability):
```http
https:///auth/open/connect/authorize?
&client_id=sandbox-example-client-123
&response_type=code
&redirect_uri=https://myservice.example/redirect
&scope=openid
&acr_values=
&state=af93kslz
&nonce=bn28sjdp
&prompt=login
```
Your next steps depend on the type of OIDC flow you want to use. After your end-users authenticate, you can retrieve the results from the **ID token** and from the **UserInfo** endpoints.
Next steps
This guide introduced how the eID and Wallet Hub works in a nutshell. Next, we recommend learning more about OIDC and exploring the eIDs documentation.
* [**OIDC**](/docs/eid-hub/oidc/): Find out more about OIDC, the authentication protocol based on the OAuth 2.0 protocol
* [**Supported eIDs**](/identity-methods/): View and learn how to integrate with the eIDs
---
## Restapi
Authentication REST API
The Authentication REST API allows you to connect to the eID and Wallet Hub and perform end-user identity verification and authentication through a REST API, where all request and response bodies are formatted in JSON.
Initial preparation
The Authentication REST API supports the OAuth 2.0 *client credentials* grant flow: you first exchange a client ID and a secret for an access token, then use the access token to authenticate the requests to the API endpoints.
To learn how to connect to this API, follow steps 1-3 in the **Connect to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::note What permissions are required?
Ensure that you set permission **Authentication REST API** for your API client.
:::
Import the Postman collection
You can make calls to the Authentication REST API using our Postman collection.
:::tip Testing only
Note that Postman is a tool for testing and learning about APIs. You should not rely on Postman in production.
:::
You can fork or import the Postman collection by clicking the button below:
[](https://app.getpostman.com/run-collection/20756027-56b06e30-202c-43b6-8838-3eb0007ebb39?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D20756027-56b06e30-202c-43b6-8838-3eb0007ebb39%26entityType%3Dcollection%26workspaceId%3D3ea7a3cf-7777-4f42-b4e9-88876cfe660d)
To start using the Postman collection, do the following:
1. Fork or import the Postman collection.
2. Open Postman and select the **Signicat Authentication REST API** collection.
3. In the Variables tab, edit the following variables:
- `baseURL`: The base URL of the API. Set this to: `https://api.signicat.com/auth/rest`.
- `oauth_scope`: The scope. Set this to: `signicat-api`.
- `oauth_client_id`: The client ID of your API client. For example, this looks like `dev-red-pin-123`.
- `oauth_client_secret`: The client secret associated to your API client.
- `oauth_url`: The Authorisation URL. Set this to: `https://api.signicat.com/auth/open/connect/token`.
4. Save your variables by clicking the save icon or pressing Ctrl+S.
Now, you are ready to obtain an access token using the variables you defined above.
Obtain an access token
To authorise requests to the API, you need to send an access token in your request. To obtain the access token with the Postman collection, do the following:
1. Select the Authorization tab.
2. Scroll to the bottom and select **Get New Access Token**.
3. If the request was successful, review the Access Token and select **Use Token**.
You have now obtained a token to authenticate to the API. When calling an API endpoint, you supply the access token in the HTTP `Authorization` header of your request. You can always review your token in **Authorization > Token**.
**Note:** Tokens have a default expiry date. If a token expires, repeat the steps above to request a new token.
Create an authentication session
To begin an authentication flow, your app needs to direct the end-user to an eID, such as Norwegian BankID. To obtain the authorization URL where to redirect the end-user to authenticate, you send a POST request to the **Create a new session** endpoint with the appropriate parameters in the body of the request.
The body of the request might look like this:
```json
{
"flow": "redirect",
"requestedAttributes": [
"name",
"dateOfBirth",
"nin",
],
"callbackUrls": {
"success": "https://example.com/success",
"abort": "https://example.com/abort",
"error": "https://example.com/error"
},
"allowedProviders": [
"nbid"
],
}
```
To begin an authentication flow using the Postman collection, do the following:
1. In the left menu, expand the collection and select the **Create a new session** endpoint.
2. In the endpoint window, select **Send** to send the request.
3. In the response window, select the **Body** tab to view the response payload.
4. Copy and paste the `authenticationUrl` link in your browser to start an authentication session with the eID. In this case, Norwegian BankID.
When adding login to your application, you will redirect the end-user to the `authenticationUrl`.
Authenticate the end-user
You need a test user to complete the authentication. For example, you can use the following credentials for Norwegian BankID:
:::CustomTable{columnWidths="33% 33% 33%"}
| National identity number | One-time password | Password |
| :----------------------- | :---------------- | :--------- |
| `01100844350` | `otp` | `qwer1234` |
| `10103933108` | `otp` | `qwer1234` |
:::
:::tip Test users for Norwegian BankID
Pre-generated test users for Norwegian BankID may become unavailable after a series of failed attempts. If this happens, you can [generate more test users](/identity-methods/nbid/test.mdx#order-test-user).
:::
After completing the authentication flow, you can retrieve the response from successful authentication.
Get the authentication session status
When using the API, you can check the status of the authentication session at any stage. When the end-user authenticates successfully, you receive the user data attributes in the response. To do this:
1. In the left menu, expand the **id** folder and open the **Get session status** endpoint.
2. To check the session status, select **Send**. This sends an HTTP GET request using the session ID obtained from the **Create a new session** endpoint.
3. Inspect the response in the **Body** tab of the response window.
If the authentication was successful (`"status": "SUCCESS"`), you find the end-user data attributes in the `subject` field.
You have now completed an authentication flow using the Authentication REST API!
Next steps
This guide introduced how the eID and Wallet Hub works in a nutshell. Next, we recommend learning more about the Authentication REST API and exploring the eIDs documentation.
* [**Authentication REST API**](/docs/eid-hub/authentication-api/): Find out more about the Signicat Authentication REST API which enables you to easily and securely authenticate your end-users.
* [**Supported eIDs**](/identity-methods/): View and learn how to integrate with the eIDs
For information about the available endpoints and properties, as well as sample requests and responses, see the Authentication REST API reference:
* [**Authentication REST API**](/apis/eid-hub/): Configure your Authentication REST API
---
## Saml2 With Form
To configure a static metadata Form in your account, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**SAML 2.0**](https://dashboard.signicat.com/bca/sp/) and select **Add new**.
2. Select the **Form** configuration method.
3. If you've already created your metadata file, upload it here. If not, create the metadata using the form fields described in the table below.
4. Select **Add** to save the configuration.
5. To download the Signicat metadata file in XML format, select **Get Signicat metadata**.
Form configuration fields
Required fields are marked with an asterisk (\*).
:::CustomTable{columnWidths="25% 75%"}
| Field name | Description |
|:-------------------------------|:------------|
| Name\* | Name of the connection. |
| Application URL | URL of your application. |
| Entity ID\* | Unique identifier for the connection. |
| Select a LoA contract\* | Select the mapping between levels of assurance that must apply to this configuration. See [Level of Assurance contracts](/docs/eid-hub/saml-2-0/saml-loa-contracts.mdx) for more information. |
| Want assertions signed | If ticked, assertions will be signed. |
| Use a transient format for the NameID | Tick this box if you only want a transient NameID.|
| Include the SAML Assertion of the IdentityProvider if available | If the eIDs that you use are SAML-based, you may opt to receive the original SAML assertion of the eID. |
| Encrypt assertion | If you want to receive an `EncryptedAssertion` instead of an `Assertion` for added security, select this option. Note that some eIDs require you to receive an `EncryptedAssertion`. |
| Assertion consuming services\* | At least one assertion consuming service must be configured. Provide a location URL and a binding type (`REDIRECT`, `POST` or `ARTIFACT`). |
| Single logout services | Enter the location URL and binding type (`REDIRECT`, `POST` or `ARTIFACT`) of any applicable single logout services. |
| Artifact resolution services | Enter the location URL, binding type and index of any applicable artifact resolution services. |
| Attribute consuming services | Enter name, index, description (optional) and at least one attribute |
| Certificate\* | Upload all relevant certificates for the connection (at least one). Information about the certificates, such as issuer and expiration date, is displayed when they are uploaded. |
| Client organisation | Enter organisation name, display name, and URL. |
| Hosting party organisation | Provide organisation name, display name, and URL. |
| Contact people | Provide details about the contact people in your organisation. In **Type of contact person**, specify whether they are part of support, a technical department, name, phone number, and more. |
| Response attribute mappings | You can customise the name of the attributes received in the response body. You can provide none or many name-to-name mappings. |
| Select attribute filter | Select an attribute filter to control which attributes you want to include, or exclude, from the response. To create attribute filters in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**Attribute filters**](https://dashboard.signicat.com/bca/attribute-filters). |
| Select default eID rule | Select which eID rule to use by default. To add eID rules in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**eID Rules**](https://dashboard.signicat.com/bca/eid-rules/). |
:::
:::tip Advanced configuration
Learn more about advanced configuration in the [Form configuration](/docs/eid-hub/saml-2-0/saml-metadata.mdx#add-form-configuration) section of the SAML 2.0 documentation.
:::
---
## Saml2 With Url
To configure a dynamic metadata URL in your account, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**SAML 2.0**](https://dashboard.signicat.com/bca/sp/) and select **Add new**.
2. Select the **URL** configuration method.
3. Fill in the configuration. You can find information about the fields in the table below.
4. Select **Add** to save the configuration.
5. To download the Signicat metadata file in XML format, select **Get Signicat's metadata**.
URL configuration fields
:::warning Registering a new Metadata URL
To fetch your metadata file, we first need to check that the URL is safe. Before adding a new Metadata URL, please contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
Required fields are marked with an asterisk (\*).
:::CustomTable{columnWidths="25% 75%"}
| Field name | Description |
|:-------------------------------|:------------|
| Name\* | Name of the connection. |
| Application URL | URL of your application. |
| Metadata URL\* | The web address where you host the metadata. |
| Select a LoA contract\* | Select the mapping between levels of assurance that must apply to this configuration. LoA contracts can be configured under **Level of assurance contracts**. |
| Select attribute filter | Select an attribute filter to control which attributes you want to include, or exclude, from the response. To create attribute filters in the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**Attribute filters**](https://dashboard.signicat.com/bca/attribute-filters). |
| Response attribute mapping | You can choose to customise the name of the attributes received in the response body. |
:::
:::tip Advanced configuration
Learn more about advanced configuration in the [URL configuration](/docs/eid-hub/saml-2-0/saml-metadata.mdx#add-url-configuration) section of the SAML 2.0 documentation.
:::
---
## Saml2
SAML 2.0
This guide explains how you can exchange XML metadata files with Signicat to set up a SAML 2.0 connection. To learn more about integrating using SAML 2.0, see [Set up SAML](/docs/eid-hub/saml-2-0/saml-metadata.mdx).
How to exchange SAML metadata
To set up a secure connection over SAML, you must provide Signicat with a metadata file.
:::info What is in the SAML metadata file?
A metadata file contains information about the service provider (SP) and the identity provider (IdP) involved in an authentication process. For example, the metadata stores the URL of the server where to send the response after the authentication session.
:::
To integrate your application with Signicat using SAML 2.0, you configure the metadata in the Signicat Dashboard. You can choose between these configuration options:
- **Dynamic with URL**: You host the metadata in your server and share the metadata URL with Signicat.
- **Static with Form**: You upload the metadata file in the Signicat Dashboard. If you don't have a metadata, you can fill in a form in the Dashboard and have Signicat generate (and store) the metadata file.
To configure a dynamic metadata URL in your account, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**SAML 2.0**](https://dashboard.signicat.com/bca/sp/) and select **Add new**.
2. Select the **URL** configuration method.
3. Fill in the configuration. You can find information about the fields in the table below.
4. Select **Add** to save the configuration.
5. To download the Signicat metadata file in XML format, select **Get Signicat's metadata**.
URL configuration fields
:::warning Registering a new Metadata URL
To fetch your metadata file, we first need to check that the URL is safe. Before adding a new Metadata URL, please contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
Required fields are marked with an asterisk (\*).
:::CustomTable{columnWidths="25% 75%"}
| Field name | Description |
|:-------------------------------|:------------|
| Name\* | Name of the connection. |
| Application URL | URL of your application. |
| Metadata URL\* | The web address where you host the metadata. |
| Select a LoA contract\* | Select the mapping between levels of assurance that must apply to this configuration. LoA contracts can be configured under **Level of assurance contracts**. |
| Select attribute filter | Select an attribute filter to control which attributes you want to include, or exclude, from the response. To create attribute filters in the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**Attribute filters**](https://dashboard.signicat.com/bca/attribute-filters). |
| Response attribute mapping | You can choose to customise the name of the attributes received in the response body. |
:::
:::tip Advanced configuration
Learn more about advanced configuration in the [URL configuration](/docs/eid-hub/saml-2-0/saml-metadata.mdx#add-url-configuration) section of the SAML 2.0 documentation.
:::
To configure a static metadata Form in your account, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**SAML 2.0**](https://dashboard.signicat.com/bca/sp/) and select **Add new**.
2. Select the **Form** configuration method.
3. If you've already created your metadata file, upload it here. If not, create the metadata using the form fields described in the table below.
4. Select **Add** to save the configuration.
5. To download the Signicat metadata file in XML format, select **Get Signicat metadata**.
Form configuration fields
Required fields are marked with an asterisk (\*).
:::CustomTable{columnWidths="25% 75%"}
| Field name | Description |
|:-------------------------------|:------------|
| Name\* | Name of the connection. |
| Application URL | URL of your application. |
| Entity ID\* | Unique identifier for the connection. |
| Select a LoA contract\* | Select the mapping between levels of assurance that must apply to this configuration. See [Level of Assurance contracts](/docs/eid-hub/saml-2-0/saml-loa-contracts.mdx) for more information. |
| Want assertions signed | If ticked, assertions will be signed. |
| Use a transient format for the NameID | Tick this box if you only want a transient NameID.|
| Include the SAML Assertion of the IdentityProvider if available | If the eIDs that you use are SAML-based, you may opt to receive the original SAML assertion of the eID. |
| Encrypt assertion | If you want to receive an `EncryptedAssertion` instead of an `Assertion` for added security, select this option. Note that some eIDs require you to receive an `EncryptedAssertion`. |
| Assertion consuming services\* | At least one assertion consuming service must be configured. Provide a location URL and a binding type (`REDIRECT`, `POST` or `ARTIFACT`). |
| Single logout services | Enter the location URL and binding type (`REDIRECT`, `POST` or `ARTIFACT`) of any applicable single logout services. |
| Artifact resolution services | Enter the location URL, binding type and index of any applicable artifact resolution services. |
| Attribute consuming services | Enter name, index, description (optional) and at least one attribute |
| Certificate\* | Upload all relevant certificates for the connection (at least one). Information about the certificates, such as issuer and expiration date, is displayed when they are uploaded. |
| Client organisation | Enter organisation name, display name, and URL. |
| Hosting party organisation | Provide organisation name, display name, and URL. |
| Contact people | Provide details about the contact people in your organisation. In **Type of contact person**, specify whether they are part of support, a technical department, name, phone number, and more. |
| Response attribute mappings | You can customise the name of the attributes received in the response body. You can provide none or many name-to-name mappings. |
| Select attribute filter | Select an attribute filter to control which attributes you want to include, or exclude, from the response. To create attribute filters in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**Attribute filters**](https://dashboard.signicat.com/bca/attribute-filters). |
| Select default eID rule | Select which eID rule to use by default. To add eID rules in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**eID Rules**](https://dashboard.signicat.com/bca/eid-rules/). |
:::
:::tip Advanced configuration
Learn more about advanced configuration in the [Form configuration](/docs/eid-hub/saml-2-0/saml-metadata.mdx#add-form-configuration) section of the SAML 2.0 documentation.
:::
Metadata file example
Here is an example of a SAML 2.0 metadata file:
```xml
XML_SIGNATURE
KEY_NAME
X509_ENCODED_CERTIFICATE
ORG_NAMEORG_DISPLAY_NAMEORG_URL
```
After you have configured the SAML metadata in the Dashboard, you are ready to initialise a request for end-user authentication.
SAML authentication examples
When the end-user wants to authenticate to your services over a SAML connection, the service provider (your app) and the identity provider communicate by sending:
1. A request: `AuthnRequest`
2. A response: `AuthnResponse`
Below, you can find examples of requests and responses. For more examples, see the [SAML examples](/docs/eid-hub/saml-2-0/saml-examples.mdx).
AuthnRequest example
The SAML `AuthnRequest` can be simple. You can always add more information in the request, but the request can be as minimal as the following example (POST binding):
```xml
ENTITY_ID
XML_SIGNATURE
```
The SAML `AuthnRequest` request needs to be encoded for transmission. Usually, it's compressed, then Base64-encoded and finally URL-encoded. Many SAML libraries handle this automatically.
Example authorisation URL
To initiate an authentication flow using SAML, you typically redirect the end-user to the authorisation URL. Depending on the SAML binding, you send the request in a different format. For example, for POST binding you can generate an authorization URL like this:
```curl
POST https:///auth/saml/login
```
and pass the following in the body of the request:
- `SAMLRequest` is your encoded `AuthnRequest` request.
- `RelayState` is optional and can be used to retain state information to return to after authentication.
AuthnResponse example
Example of a SAML response `AuthnResponse` after the end-user logged in with eHerkenning:
```xml
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
XML_SIGNATURE
https:/*YOUR_SIGNICAT_DOMAIN*/auth/saml
XML_SIGNATURE
k5QDBPNavooSgsxQNCITxSnQc5oo37cqev726-Iz1-Y=ENTITY_IDGerarda Josephina KierkegaardGerarda JosephinaKierkegaardemail@example.com03659FB1FAE5D26DB2D28866C1A4FE7F4E1CD5E62DD2552EE3D3B11D4C27163D@9162F54B3B07284AC4E147A849DEAEE424444001819935177urn:etoegang:DV:00000003244440010000:services:9121cf1c1457-cc97-4b47-a324-25d1a97db3cb24444002SignicatIntermediaryurn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransporturn:etoegang:HM:00000003244440010000:entities:9713
```
Next steps
This guide introduced how the eID and Wallet Hub works in a nutshell. Next, we recommend learning more about SAML 2.0 and exploring the eIDs documentation.
* [**SAML 2.0**](/docs/eid-hub/saml-2-0/): Find out more about SAML, an XML-based standard for exchanging authentication and authorisation data between security domains.
* [**Supported eIDs**](/identity-methods/): View and learn how to integrate with the eIDs
---
## How it works(Risk-indicator)
The Authentication Risk Indicator analyses specific attributes to detect whether an authentication session is likely to represent malicious or suspicious activity. Our risk engine supports customised rules that you can configure in order to perform an assessment in line with your security requirements.
During an authentication session, the risk engine performs a data-driven risk assessment to determine the risk level based on information such as device, network and behavioural patterns. After the authentication completes, you receive a risk rating that indicates the level of anomalous activity detected. The value can be low, medium, or high.
The insights you receive from the Authentication Risk Indicator allow you to mitigate malicious threats promptly and define follow-up actions before granting access to your end-users.
:::note Note
The Authentication Risk Indicator is intended for use as a supplementary tool and should not be solely relied upon when making risk decisions.
:::
## Risk data
The Authentication Risk Indicator gathers and analyses several device, network and behavioural attributes from an authentication session. Data availability varies depending on the eID method used for authentication. If available, Signicat calculates the risk rating using data such as user's IP address, geolocation and number of failed attempts.
{/*
:::CustomTable{columnWidths="25% 75%"}
| Attributes | Description |
|------------------------|---------------------------------------------|
| IP address | Source network address used for authentication. Allows to detect proxies and anomalous login patterns. |
| Geolocation | Approximate physical location derived from IP. Allows to flag unusual or high-risk regions. New locations are flagged on the first login and receive a low risk score thereafter. |
| Number of failed attempts | Count of recent failed attempts since last successful authentication, indicating possible brute-force or credential-stuffing activity.|
| User-agent | Browser and device signature, supporting the detection of inconsistencies. |
| App device type | Category of device (mobile, tablet, desktop). Allows to spot unexpected device changes. |
| Timestamps of previous authentication sessions | Records of login times. Allows to analyse behavioural patterns and identify unusual activity. |
:::
*/}
:::info Other authentication information
The Authentication Risk Indicator is in active development; more risk attributes will be available soon.
:::
:::note Is this data returned in the response?
In the response you only receive the risk rating without the underlying raw data used for the calculation. This is to comply with GDPR and privacy regulations.
:::
## Set the rules
The Authentication Risk Indicator allows you to configure risk-prevention rules to identify suspicious or risky activity. Risk rules have customised logic and definitions, based on lambda expressions, used to determine the risk level of an authentication session.
For example, you could create a basic rule to count the number of failed login attempts for a specific user within the last 15 minutes. You would then determine the risk level based on the number of failed attempts over time, say high risk above 10 attempts.
{/* You can create groups of multiple rules to handle specific fraud detection needs and different scenarios by using [Risk policies](#risk-policies). */}
:::info Can rules encode follow-up actions?
The rules you define are only used to calculate the risk rating of an authentication.
After you receive the risk rating for an authentication session, you should decide which action (if any) to take based on the result of the Risk Indicator. Then, you should handle the logic on your application side.
For example, if a risk is returned as high, you should decide whether the transaction should be cancelled, completed, or if some other follow-up verification steps should occur.
:::
{/*
## Risk policies
With the Authentication Risk Indicator, you can configure policies tailored to different fraud detection scenarios. Each policy may contain several rules and handle a single eID.
For instance, you could have a policy to group and evaluate together:
- A rule to check for a high number of failed login attempts
- A rule to track the geolocation of the user device across session.
Then, you can add weights to assign different importance to each rule. Weights are factored in when calculating the final risk rating, as explained below. */}
## Risk rating
The risk rating you receive can have one of the following values:
- Low
- Medium
- High
High is the strongest indication of an authentication with anomalous activity.
### How the risk rating is calculated
When configuring the Risk Indicator, you can choose which algorithm to use to calculate the risk rating:
- **Max value**: Returns the highest risk level found across all rules. For example, if one rule/parameter returns a high value, the Risk Indicator will return a "high" risk rating, regardless of other ratings.
- **Weighted average**. Returns the average value of all ratings from different rules, after applying the respective weights. By default, all rules have equal weights, but you can customise the weights to suit your individual risk profile.
## Types of risk evaluation
The Signicat eID and Wallet Hub supports two different types of risk assessment:
- **Risk engine evaluation**
- **Third-party eID processing and evaluation**
When you activate the Authentication Risk Indicator and request a risk assessment for an authentication session, you always receive the Signicat risk engine evaluation and, optionally, also the third-party assessment from the eID.
### Risk engine evaluation
The **Risk engine evaluation** is designed by Signicat and it allows you to set customised rules and settings. When you activate this product, one of our onboarding managers will support you with setting up different rules and risk rating options.
{/* The Signicat **Risk engine evaluation** allows you to configure customised rules and settings in the Signicat Dashboard. Here, you can manage your policies and choose among different risk rating options. */}
### Third-party eID processing and evaluation
In addition, certain eID methods provide their own risk evaluation, we refer to this as **Third-party eID evaluation**.
For example, Swedish BankID (SBID) provides a risk indicator in the authentication response. We pass this risk indicator to you in the authentication response. Note that this risk indicator is independent of Signicat's in-house processed risk rating.
:::note Are these different values?
Note that the risk ratings returned by the Signicat Risk engine evaluation and the third-party eID processing evaluation are calculated differently and might therefore have different values.
:::
---
## Authentication Risk Indicator
The Authentication Risk Indicator assists you with preventing identity-related fraud by identifying high-risk authentications. This add-on tool relies on a data-driven risk engine to determine how a user authentication is likely to represent anomalous or malicious activity.
Signicat assigns a risk level—low, medium, or high—to each authentication session by applying a set of rules to process data such as:
- The IP address and geolocation of the user
- Timestamps of previous authentications
- Record of failed transactions
- Device agent
Using this information, you can define customised rules to handle different risk scenarios and prevent identity-related fraud. Learn more about the features of the Risk Indicator in the [How it works](/docs/eid-hub/risk-indicator/how-it-works.mdx) page.
:::note Which eIDs are supported?
We are in the process of rolling out the Risk Indicator for all eIDs. Currently, this feature is available for:
- [Swedish BankID](/identity-methods/sbid/) - Third-party eID processing and evaluation
- [Danish MitID](/identity-methods/mitid/) - Signicat risk engine evaluation
:::
:::note Additional costs apply
This is a paid add-on feature to the Signicat eID and Wallet Hub. Please note that additional costs will apply. We recommend that you contact one of our onboarding managers or [Signicat Sales](https://www.signicat.com/contact/contact-sales) for more details on pricing and activation.
:::
## Get started
* [**Quick start guide**](/docs/eid-hub/risk-indicator/quick-start-guide): Get started with the Risk Indicator
* [**How it works**](/docs/eid-hub/risk-indicator/how-it-works): Learn about the concepts of the Risk Indicator
## Support
If you have questions, you can contact us by creating a support ticket in the Signicat Dashboard:
[**Create support ticket**](https://dashboard.signicat.com/contact-us/tickets/new)
---
## Quick start guide(Risk-indicator)
# Quick start guide
Learn how to set up safe authentications using the Authentication Risk Indicator.
This quick start guide shows you how to:
1. Prepare for testing authentications with Authentication Risk Indicator.
2. Craft your authentication request.
3. Perform end-user authentication.
4. Review the risk assessment in the response.
:::note Additional costs apply
This is a paid add-on feature to the Signicat eID and Wallet Hub. Please note that additional costs will apply. We recommend that you contact one of our onboarding managers or [Signicat Sales](https://www.signicat.com/contact/contact-sales) for more details on pricing and activation.
:::
## Prerequisites
The Authentication Risk Indicator is an add-on to the Signicat eID Hub. To start using this feature, you first need to have completed the following preparations:
1. Follow the [Quick start guide](/docs/eid-hub/quick-start/index.mdx) for the eID and Wallet Hub. In particular, make sure you:
1. Get started with the Signicat Dashboard.
2. Add an eID.
3. Set up an authentication protocol.
2. Activate the Authentication Risk Indicator with an onboarding manager or [Signicat Sales](https://www.signicat.com/contact/contact-sales).
## End-user authentication flow
Below, you can find a sequence diagram that outlines how a typical authentication flow with the Risk Indicator works.
```mermaid
sequenceDiagram
participant User as End-User
participant Client as Your Application (Client)
participant Auth as Signicat Auth Server
User->>Client: Access protected resource / start authentication
Client->>Auth: Send Authentication request with Risk Indicator attribute
Auth->>User: Present Login & Optional Consent
User->>Auth: Submit Credentials / Factors
Auth->>Client: Return Authentication Result (token/assertion/session info)
Client->>Auth: Optional call for additional user attributes
Auth->>Client: Attributes Response (includes risk rating)
Client->>Client: Enforce risk rules & establish session
Client->>User: Access Granted
```
### 1. Authentication request
To obtain a risk evaluation of an end-user authentication with the Authentication Risk Indicator, you need to specify a parameter in the authentication request.
How you specify the risk parameter varies per authentication protocol. Below, select the tab of the authentication protocol you use to connect your application.
#### Request example
To start an end-user authentication with OIDC, you direct the end-user to the authorisation endpoint (`https:///auth/open/connect/authorize`) with the appropriate set of parameters.
To request the Authentication Risk Indicator for an authentication session, you need to provide the `risk` scope in the authentication request.
```
scope=openid risk
```
The example below shows what an authentication request could look like.
```curl {5} title="Example: Authentication request with risk scope"
https:///auth/open/connect/authorize?
&client_id=
&response_type=
&redirect_uri=https://myservice.example/redirect
&scope=openid%20risk
&code_challenge=ABC123
&code_challenge_method=S256
&state=12345
&nonce=678910
```
When using SAML, you can request attributes in a few different ways, as explained in the [SAML Requested Attributes](/docs/eid-hub/saml-2-0/saml-requested-attributes.mdx) documentation.
To request the Authentication Risk Indicator for an authentication session, you need to provide the `risk` attribute in your preferred SAML 2.0 way.
To add the `risk` attribute in your `AuthnRequest`, you need to specify it using the `RequestedAttributes` element, as shown below:
```xml {4} title="Example: AuthnRequest with risk attribute"
```
To start an end-user authentication with the Signicat REST API, you first send a request to the [CreateSession](pathname:///apis/eid-hub/#tag/Authentication-Session/operation/CreateSession) endpoint with the appropriate set of parameters in the payload.
To request the Authentication Risk Indicator for an authentication session, you need to provide the `risk` scope in the `requestedAttributes` property in the payload of authentication request.
```json {5} title="Example: requestedAttributes with risk scope"
...
"flow": "redirect",
"requestedAttributes": [
"idpId",
"risk",
],
...
```
The example below shows what an authentication request could look like.
```http {12} title="Example: Create session request with risk scope"
POST /auth/rest/sessions HTTP/1.1
Host:
Content-Type: application/json
Accept: application/json
Authorization: Bearer eyJ...YNzg
Content-Length: 235
{
"flow": "redirect",
"requestedAttributes": [
"idpId",
"risk"
],
"callbackUrls": {
"success": "https://example.com/success",
"abort": "https://example.com/abort",
"error": "https://example.com/error"
},
}
```
In the response, you receive the `authenticationUrl` where to redirect the end-user to start an authentication session.
```json title="Example: Authentication URL with risk scope"
{
"id": "c99e17e2-b124-f549-a88c-408f8e555d31",
"accountId": "",
"authenticationUrl": "https:///broker/sp/external-service/login?messageId=78b6b34..b4377d4c&transactionId=f4d..Ad1",
"status": "CREATED",
"callbackUrls": {
"success": "https://example.com:443/success?sessionId=5b8b2527-4d38-4256-a2c9-ffabd51db776",
"abort": "https://example.com:443/abort?sessionId=5b8b2527-4d38-4256-a2c9-ffabd51db776",
"error": "https://example.com:443/error?sessionId=5b8b2527-4d38-4256-a2c9-ffabd51db776"
},
"flow": "redirect",
"requestedAttributes": [
"idpId",
"risk",
],
"sessionLifetime": 1200,
"expiresAt": "2025-12-02T12:47:30.0635565+00:00"
}
```
### 2. User authenticates at the eID
When the end-user navigates to the authentication URL, Signicat redirects the session to the eID method of choice. Here, the eID presents:
- Login screen
- Optional multi-factor challenge
- Optional consent screen (including the custom risk scope)
If the user consents and authentication succeeds, the eID redirects the user back to your `redirect_uri`. You can then proceed to retrieve the authentication response and evaluate its content to assess the risk rating calculated.
### 3. Receive the authentication response
#### Response example
After an authentication session has been completed, your receive a response with authorisation code. You need to exchange this code in the request to the `/token` endpoint to obtain:
- **Access Token**: Authorises access to APIs or UserInfo
- **ID Token**: Proves the user has authenticated
- **Refresh Token**
The token response contains an ID token. This token contains the core user identity claims for the scopes you requested in the authentication request, including those specific to the Authentication Risk Indicator.
After you read and validate the ID Token, you can retrieve the risk rating calculated by the risk engine, as part of the risk scope:
```json title="Example: Authentication response with risk rating"
"risk": {
"selfEvaluation": {
"riskValue": "medium"
}
}
```
**Third-party eID processing and evaluation**
Optionally, if the eID method used for authentication supports risk rating analysis, you will also receive a `thirdPartyEvaluation` object that contains:
- **riskValue**: Rating calculated by the third-party eID service.
- **source**: Name of the eID.
```json title="Example: Authentication response with third-party risk rating"
"risk": {
"thirdPartyEvaluation": {
"riskValue": "high",
"source": "sbid"
}
}
```
When the end-user completes the authentication successfully, the response contains the end-user identity data together with the risk rating calculated by the risk engine.
Authentication response example with risk rating (edited for readability)
```xml {4} title="Example: AuthnRequest with risk attribute"
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
medium
```
**Third-party eID processing and evaluation**
Optionally, if the eID method used for authentication supports risk rating analysis, you will also receive a `thirdPartyEvaluation` object that contains:
- **riskValue**: Rating calculated by the third-party eID service.
- **source**: Name of the eID.
```xml {4} title="Example: Authentication response with third-party risk rating"
high
sbid
```
During the authentication process, you can check the status of the session to track whether the flow has started, failed or completed. To get the status of a session, send a GET request to `https://api.signicat.com/auth/rest/sessions/{id}`, where the `id` is provided in the response you received when you created the session. In the response example above, the `id` is `c99e17e2-b124-f549-a88c-408f8e555d31` so the request would be `https://api.signicat.com/auth/rest/sessions/c99e17e2-b124-f549-a88c-408f8e555d31`.
When the end-user completes the authentication successfully, the response has status is `SUCCESS` and contains the end-user identity data together with the risk rating calculated by the risk engine.
Authentication response example with risk rating (edited for readability):
```json {9-13} title="Example: Authentication response with risk rating"
{
"id": "c99e17e2-b124-f549-a88c-408f8e555d31",
"accountId": "",
"status": "SUCCESS",
"provider": "mitid",
"subject": {
"id": "X6hYg...NQ=",
"idpId": "5D6C8...63066F",
"risk": {
"selfEvaluation": {
"riskValue": "medium"
},
},
},
"flow": "redirect",
"requestedAttributes": [
"idpId",
"risk",
],
}
```
**Third-party eID processing and evaluation**
Optionally, if the eID method used for authentication supports risk rating analysis, you will also receive a `thirdPartyEvaluation` object that contains:
- **riskValue**: Rating calculated by the third-party eID service.
- **source**: Name of the eID.
```json title="Example: Authentication response with third-party risk rating"
"risk": {
"thirdPartyEvaluation": {
"riskValue": "high",
"source": "sbid"
}
}
```
### 4. Use the risk rating in your policy
Depending on the returned rating, on your application side you might want to implement an access restriction policy, such as:
- Allow login normally
- Require additional verification (MFA)
- Require stepped-up authentication
- Flag suspicious activity
- Restrict access
Once your application validates the ID Token and verifies any identity-fraud checks, you may redirect your end-users to start an authenticated session in your digital service.
---
## SAML 2.0
Security Assertion Markup Language (SAML) is an XML-based standard for exchanging authentication and authorisation data between security domains. Typically, this exchange happens between an identity provider like Signicat and a service provider (your organisation). SAML is a product of the [OASIS Security Services Technical Committee](https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=security).
SAML is an industry standard protocol for identity management and is supported by most of the biggest actors in the computer industry. For detailed information about SAML 2.0, relevant technical terms and access to several white papers, visit [this page](https://www.oasis-open.org/specs/index.php#samlv2.0) on the OASIS website.
Signicat supports the SAML 2.0 standard fully, through a gateway referred to as the 'SAML gateway' or 'SAML2 gateway'. If you are using an identity federation service such as Microsoft AD FS or Oracle Identity Federation, then you are most likely interested in Signicat's SAML2 gateway.
## Authentication using SAML 2.0
Signicat's SAML2 gateway provides a solution for end-user authentication over the SAML 2.0 protocol between two parties: you, a service provider (SP), and Signicat, as the message broker to the identity providers (IdP). The SAML2 gateway is integrated within the Signicat eID and Wallet Hub, which means that you can perform authentications over the SAML 2.0 protocol with all the eIDs supported by Signicat. In this scenario, Signicat acts as the single point of integration between your application and the third-party identity providers (also known as eIDs).
To get started with end-user authentication using the SAML 2.0, go to the [Set up SAML](/docs/eid-hub/saml-2-0/saml-metadata) guide.
### Using a federation service
If you rely on a SAML 2.0 federation service to establish connections with Signicat, you need to configure Signicat also in your federation service. Examples of such federation services are:
- Microsoft Active Directory Federation Services (AD FS)
- Oracle Identity Federation (OIF)
- [SimpleSAML](https://simplesamlphp.org/), a PHP-based solution developed through a project led by UNINETT in Norway.
The IdP, and other communication parameters between SP and IdP, should be configured in this SAML 2.0 federation service. After the SAML 2.0 configuration is established, you will need to define the SAML 2.0 configuration in the federation system.
## Guides
* [**Set up a SAML connection**](/docs/eid-hub/saml-2-0/saml-metadata): Exchange metadata to set up a SAML connection
* [**SAML examples**](/docs/eid-hub/saml-2-0/saml-examples): Take a look at some SAML examples
* [**Requested Attributes**](/docs/eid-hub/saml-2-0/saml-requested-attributes): Learn about SAML Requested Attributes
* [**Level of Assurance contracts**](/docs/eid-hub/saml-2-0/saml-loa-contracts): Learn about LoA contracts and how to set them up
## External references
- [SAML 2.0 OASIS specification - Technical overview](https://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0-cd-02.html#4.SAML%20Architecture|outline)
- [SAML 2.0 OASIS specification - Metadata](https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf)
- [SAML 2.0 OASIS specification - Assertions and protocols](https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf)
---
## SAML examples
## AuthnRequest
To initiate an authentication process, you send an `AuthnRequest` to Signicat.
#### AuthnRequest basic example
This example contains a basic SAML `AuthnRequest`. You can always add additional information in the request, but the bare minimum request can look like:
```xml
ENTITY_ID
XML_SIGNATURE
```
#### AuthnRequest example with language
The following example shows how to specify the language as an attribute:
```xml {15-18}
ENTITY_ID
XML_SIGNATURE
no
```
#### AuthnRequest example REDIRECT binding with prefilled attributes
```xml
ENTITY_ID
...
subject@example.com1234567890
```
#### AuthnRequest with IdP scoping
[IdP scoping](/docs/eid-hub/concepts/idp-scoping.mdx?protocol=saml) allows you to define which eIDs to make available for authentication to your users. To use IdP scoping with SAML 2.0, specify the eIDs in the `ProviderID` of the `IDPEntry` field, as shown below:
```xml {13}
ENTITY_ID
XML_SIGNATURE
```
To learn more about this feature, see the [IdP scoping](/docs/eid-hub/concepts/idp-scoping.mdx?protocol=saml) documentation.
#### AuthnRequest with RequestedAuthnContext and with REDIRECT binding
```xml
ENTITY_IDurn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
```
## AuthnResponse
At the end of an authentication flow, the identity provider sends a SAML `AuthnResponse` to the service provider. In this case, Signicat sends you an `AuthnResponse` at the end of an end-user authentication flow. If the end-user authentication is successful, the response contains the `Assertion` with the `NameID` and attributes of the end-user.
#### AuthnResponse example with DigiD
Example of a SAML response after end-user login with DigiD:
```xml
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
...
n8ek7xaPjR6XOGseV-NI9MJvLH6Zf2ciWC0gSEuLo5A=ENTITY_ID900234854NLPERSONurn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransporthttps://was-preprod1.digid.nl/saml/idp/metadata
```
#### AuthnResponse example with eHerkenning
Example `AuthnResponse` after end-user login with eHerkenning:
```xml
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
XML_SIGNATURE
https://*YOUR_SIGNICAT_DOMAIN*/auth/saml
XML_SIGNATURE
k5QDBPNavooSgsxQNCITxSnQc5oo37cqev726-Iz1-Y=ENTITY_IDGerarda Josephina KierkegaardGerarda JosephinaKierkegaardemail@example.com03659FB1FAE5D26DB2D28866C1A4FE7F4E1CD5E62DD2552EE3D3B11D4C27163D@9162F54B3B07284AC4E147A849DEAEE424444001819935177urn:etoegang:DV:00000003244440010000:services:9121cf1c1457-cc97-4b47-a324-25d1a97db3cb24444002SignicatIntermediaryurn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransporturn:etoegang:HM:00000003244440010000:entities:9713
```
## Learn more
* [**Set up a SAML connection**](/docs/eid-hub/saml-2-0/saml-metadata): Exchange metadata to set up a SAML connection
* [**Requested Attributes**](/docs/eid-hub/saml-2-0/saml-requested-attributes): Learn about SAML Requested Attributes
---
## Level of Assurance contracts
A Level of Assurance (LoA) contract is a set of mappings between the levels of assurance as defined in the eID's documentation (or protocol specifications) and some relative values (levels 1, 2, 2+, 3 and 4).
For example, for SAML, `urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport` is mapped to level 2.
## Create a Level of Assurance contract
To create a Level of Assurance contract:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**Levels of Assurance**](https://dashboard.signicat.com/bca/loa-contracts).
2. Select **Add new** to create a new LoA contract.
3. In the **Name** field, enter a name for your set of mappings.
4. Under **Level of Assurance mapping**, enter the name of the level of assurance as defined for the eID (or protocol) you want to configure. Then, select the level of assurance you want to map it to. To map any additional level of assurance, select **Add more**.
5. Select **Save**.
You can view an example of a mapping for eHerkenning:
## Learn more
* [**Set up a SAML connection**](/docs/eid-hub/saml-2-0/saml-metadata): Exchange metadata to set up a SAML connection
* [**Add eID**](/identity-methods/): Continue to the eID setup to complete your initial configuration
---
## Set up SAML
To set up a connection using SAML 2.0, you need to exchange metadata with Signicat. This process, known as _trust establishment_, allows the two parties to express trust for each other. The metadata also describes the type and format of the SAML 2.0 request and response.
You can choose how to establish trust in the SAML 2.0 configuration in the Signicat Dashboard. You have the option to either self-host or upload the metadata in the Dashboard.
On this page, you'll find instructions to set up SAML 2.0 in the Dashboard. You'll learn how to share or create the metadata and prepare yourself to connect to eIDs through the Signicat eID and Wallet Hub. You can also watch a video that shows how to set up SAML 2.0 in the [Tutorial videos](#tutorial-video) section.
:::tip New customers
If you are new to Signicat, learn more in the [Get started with Signicat](/docs/) page.
:::
## SAML metadata
In SAML2.0, the service provider (SP) and the identity provider (IdP) establish connections by exchanging metadata with each other. The format of the metadata should follow the [SAML 2.0 OASIS specification](https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf).
### Examples of metadata
Below, you can find examples of metadata files configured with the POST or ARTIFACT bindings:
```xml
XML_SIGNATURE
KEY_NAME
X509_CERTIFICATE
ORG_NAMEORG_DISPLAY_NAMEORG_URL
```
```xml
XML_SIGNATURE
KEY_NAME
X509_CERTIFICATE
ORG_NAMEORG_DISPLAY_NAMEORG_URL
```
## How to exchange metadata
To set up a secure connection over SAML 2.0 with Signicat eID and Wallet Hub, you have to provide us with a metadata file. You can choose between the following two ways:
- [**URL configuration**](#add-url-configuration) (dynamic): You host and maintain the metadata file on your server. You generate the metadata file on your own, make it available at an endpoint and share the URL with us. Signicat fetches the metadata dynamically. When you want to update the metadata with new certificates, you only need to update the metadata on your server side.
- [**Form configuration**](#add-form-configuration) (static): You upload or create a metadata in the Signicat Dashboard. You can either generate the file and upload it to the Dashboard or fill in a form in the Dashboard and have Signicat generate the metadata file for you. To update your metadata file with new certificates, you must re-upload the file manually on the Dashboard. The metadata file is stored inside Signicat's infrastructure.
:::tip If you don't have a SAML 2.0 metadata file
If you are not able to create a metadata file, you can fill in a form in the Dashboard to provide information about the connection. We use this information to automatically build a metadata file for you.
:::
### Add URL configuration
The advantage with a URL configuration is that metadata exchange is dynamic. This means that your metadata and certificates are always up to date and are automatically updated whenever they change. This is because Signicat fetches the URL you provide periodically to ensure that we always use the latest version of your metadata.
To establish a SAML connection with a **URL configuration** for your metadata, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**SAML 2.0**](https://dashboard.signicat.com/bca/sp/) and select **+ Add new**.
2. Choose the **URL** configuration.
3. Fill in the following fields in the **Standard** tab:
:::CustomTable{columnWidths="25% 25% 50%"}
| Field name | Required | Description |
| :---------------------- | :------- | :--------------------------------------------- |
| Name | Yes | The name for your connection. |
| Application URL | No | The URL of your application. |
| Metadata URL | Yes | The web address where you host the metadata. |
| Select a LoA contract | Yes | The Level of Assurance. Select the mapping between levels of assurance to apply to this configuration. See the [Level of Assurance contracts](/docs/eid-hub/saml-2-0/saml-loa-contracts.mdx) documentation. |
:::
:::note Metadata URL verification
If your Metadata URL appears unsafe, Signicat Support needs to verify the source. If your connection requires additional verification, click the **creating a support ticket** link in the notice banner to request verification and save your changes.
Note that your connection will remain in a **Pending** state, until Signicat Support has verified your domain.
:::
4. To configure the **Advanced** tab, see the [Advanced URL configuration fields](#advanced-url-configuration-fields) section below.
5. Select **Add** to save the configuration.
:::tip Get Signicat's metadata
To view Signicat's metadata (XML file), select the **Get Signicat's metadata** button. Then, you can copy the file and store it in your application. Alternatively, you may configure your application to query the URL and load the metadata dynamically.
:::
#### Connection status
After saving your SAML 2.0 connection with URL configuration, you can track its status on the SAML 2.0 overview page. You may encounter the following statuses:
- **Active**: The domain is trusted, and the metadata was successfully downloaded and parsed. Your SAML connection is fully operational.
- **Inactive**: The connection has been manually deactivated. You can re-activate it at any time.
- **Invalid**: The domain is trusted, but the system could not download or parse the metadata file correctly. This often happens due to a broken URL, a temporary network issue, or a corrupted XML file.
:::tip Refresh the metadata
To check whether your metadata file is valid, open your connection details and click **Refresh metadata** to manually retry fetching the file. If the issue persists, contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
:::
- **Pending**: Your connection is saved, but the root domain has not been verified yet. The system will not attempt to fetch metadata until Signicat Support approves your ticket.
#### Advanced URL configuration fields
:::CustomTable{columnWidths="25% 75%"}
| Advanced field name | Description |
| :------------------------------------------------------ | :----------------------------------------------- |
| Want root signed even if the assertions are also signed | We recommend to always sign the root. If your application cannot handle multiple signatures, you may opt to disable signing of the root when signing the assertions. |
| Use a transient format for the NameID | If you only want a transient "NameID", tick this box. |
| Include the SAML Assertion of the IdentityProvider if available | If you use a SAML 2.0-based eID, you may opt to receive the original SAML 2.0 assertion from the eID. |
| Encrypt assertion | If you want to receive an `EncryptedAssertion` instead of an `Assertion` for added security, select this option. Note that some eIDs require you to receive an `EncryptedAssertion`. You can select which algorithm to use for key and data encryption: _Data Encryption Algorithm_: The algorithm to use for data encryption. Default is [http://www.w3.org/2009/xmlenc11#aes128-gcm](http://www.w3.org/2009/xmlenc11#aes128-gcm). _Key Encryption Algorithm_: The algorithm to use for key encryption. Default is [http://www.w3.org/2009/xmlenc11#rsa-oaep](http://www.w3.org/2009/xmlenc11#rsa-oaep). If your application cannot work with these algorithms, you may select another algorithm from the dropdown menus. Our implementation of Encrypted Assertion is based on the SAML specification [https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf](https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf) and the XML encryption specification [https://www.w3.org/TR/xmlenc-core1/](https://www.w3.org/TR/xmlenc-core1/). |
| Select attribute filter | Select an attribute filter to control which attributes you want to include, or exclude, from the response. To create attribute filters in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**Attribute filters**](https://dashboard.signicat.com/bca/attribute-filters). |
| Select default eID rule | Select which default eID rule to use. To add eID rules in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**eID Rules**](https://dashboard.signicat.com/bca/eid-rules/). |
| Response attribute mappings | You can create mappings to customise the name of the attributes you receive in the response body. You can define none or many name-to-name mappings. |
:::
#### Cache duration
You can control the maximum length of time Signicat caches the metadata retrieved from the URL configuration by setting the `cacheDuration` in the metadata file, as specified in the [OASIS SAML 2.0 documentation](https://docs.oasis-open.org/security/saml/v2.0/saml-metadata-2.0-os.pdf).
The default `cacheDuration` of the metadata is set to 4 hours. This means that, if you update the metadata, it could take up to 4 hours before Signicat uses the new metadata.
The highest value supported is 4 hours and the lowest value supported is 5 minutes. That means that, in case a `cacheDuration` larger than 4 hours is specified, it will refresh every 4 hours. Likewise, if a duration smaller than 5 minutes is specified, it will refresh every 5 minutes.
On the `EntityDescriptor` you can add an (optional) attribute `cacheDuration`:
```xml
```
The duration should be formatted as described [here](https://www.w3schools.com/xml/schema_dtypes_date.asp).
For example, to set the metadata `cacheDuration` to 30 minutes, add the `cacheDuration="PT30M"` attribute to your metadata, as shown:
```xml
...
```
### Add Form configuration
Form configuration is an alternative way to create a SAML connection when you prefer to:
- Upload your metadata file in the Signicat Dashboard, or
- Generate a metadata file by providing information in a web form.
:::tip Generate a metadata
We recommend you generate a metadata with the web form when you are not able to create a metadata file in your application.
:::
Once you have added your metadata, the file is stored safely in the Signicat Dashboard. Remember that you can always modify its configuration.
#### How to add a metadata file
To create a new SAML 2.0 connection with **Form configuration** for your metadata, do the following:
1. In the Signicat Dashboard, navigate to **Products** > **eID and Wallet Hub** > [**SAML 2.0**](https://dashboard.signicat.com/bca/sp) and select **+ Add new**.
2. Choose the **Form** configuration option.
Now, follow the instructions to either upload or generate the metadata file in the following sections.
#### Upload a metadata file
To share your metadata file:
1. Upload a valid XML file in the **Upload service provider metadata** section.
2. Fill in the **Name** with the name for your connection.
3. Optional, you may need to further customise your configuration by filling in the **Standard** and **Advanced** tabs. For more details about the fields in the form, see the next section.
Once you have uploaded your metadata and configured your connection, select **Add** to save the changes.
:::tip Get Signicat's metadata
To view Signicat's metadata (XML file), select the **Get Signicat's metadata** button. Then, you can copy the file and store it in your application. Alternatively, you may configure your application to query the URL and load the metadata dynamically.
:::
#### Generate a metadata file
To let Signicat generate a metadata file for you, fill in the fields in the Standard and Advanced tabs. These are the fields you can configure:
**Standard**
:::CustomTable{columnWidths="25% 75%"}
| Field name | Description |
| :---------------------- | :--------------------------------------------- |
| Name\* | Name of the connection. |
| Application URL | URL of the service provider application. |
| Metadata URL\* | The web address where you host the metadata. |
| Select a LoA contract\* | Select the mapping between levels of assurance that must apply to this configuration. See [Level of Assurance contracts](/docs/eid-hub/saml-2-0/saml-loa-contracts.mdx) for more information. |
:::
\* Required fields are marked with an asterisk (\*).
**Advanced configuration**
:::CustomTable{columnWidths="25% 75%"}
| Field name | Description |
| :-------------------------------------------------------------- | :------------------------------------------------------|
| Want assertions signed | If ticked, assertions will be signed. |
| Want root signed even if the assertions are also signed | We recommend to always sign the root. If your application cannot handle multiple signatures, you may opt to disable signing of the root when signing the assertions. |
| Use a transient format for the NameID | Tick this box if you only want a transient NameID. |
| Include the SAML Assertion of the IdentityProvider if available | If the eIDs that you use are SAML 2.0-based, you may opt to receive the original SAML 2.0 assertion of the eID. |
| Encrypt assertion | If you want to receive an `EncryptedAssertion` instead of an `Assertion` for added security, select this option. Note that some eIDs require you to receive an `EncryptedAssertion`. You can select which algorithm to use for key and data encryption: _Data Encryption Algorithm_: The algorithm to use for data encryption. Default is [http://www.w3.org/2009/xmlenc11#aes128-gcm](http://www.w3.org/2009/xmlenc11#aes128-gcm). _Key Encryption Algorithm_: The algorithm to use for key encryption. Default is [http://www.w3.org/2009/xmlenc11#rsa-oaep](http://www.w3.org/2009/xmlenc11#rsa-oaep). If your application cannot work with these algorithms, you may select another algorithm from the dropdown menus. Learn more about XML encryption at [https://www.w3.org/TR/xmlenc-core1/](https://www.w3.org/TR/xmlenc-core1/). |
| Assertion consuming services\* | At least one assertion consuming service must be configured. Provide a location URL and a binding type (`REDIRECT`, `POST` or `ARTIFACT`). |
| Single logout services | Enter the location URL and binding type (`REDIRECT`, `POST` or `ARTIFACT`) of any applicable single logout services. |
| Artifact resolution services | Enter the location URL, binding type and index of any applicable artifact resolution services. |
| Attribute consuming services | Enter name, index, description (optional) and at least one attribute |
| Certificate\* | Upload all relevant certificates for the connection (at least one). Information about the certificates, such as issuer and expiration date, is displayed when they are uploaded. |
| Client organisation | Enter organisation name, display name, and URL. |
| Hosting party organisation | Provide organisation name, display name, and URL. |
| Contact people | Provide details about the contact people in your organisation. In **Type of contact person**, specify whether they are part of support, a technical department, name, phone number, and more. | You can customise the name of the attributes received in the response body. You can provide none or many name-to-name mappings. |
| Select attribute filter | Select an attribute filter to control which attributes you want to include, or exclude, from the response. To create attribute filters in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**Attribute filters**](https://dashboard.signicat.com/bca/attribute-filters). |
| Select default eID rule | Select which default eID rule to use. To add eID rules in the Dashboard, navigate to **Products** > **eID and Wallet Hub** > **Advanced** > [**eID Rules**](https://dashboard.signicat.com/bca/eid-rules/). |
:::
\* Required fields are marked with an asterisk (*).
Once you have completed your configuration, select **Add** to save the changes.
:::tip Get Signicat's metadata
To view Signicat's metadata (XML file), select the **Get Signicat's metadata** button. Then, you can copy the file and store it in your application. Alternatively, you may configure your application to query the URL and load the metadata dynamically.
:::
## Tutorial video
This video shows you how to configure a SAML 2.0 connection in the Signicat Dashboard.
## Learn more
Explore the SAML 2.0 documentation to discover request examples and learn about advanced topics.
* [**SAML examples**](/docs/eid-hub/saml-2-0/saml-examples): Take a look at some SAML examples
* [**Requested Attributes**](/docs/eid-hub/saml-2-0/saml-requested-attributes): Learn about SAML Requested Attributes
---
## SAML Requested Attributes
Requested Attributes allow you to specify the user information (attributes) that you ask Signicat to include in the SAML assertion.
You control the requested attributes by using the XML element `RequestedAttribute` which you can pass in your request in a few ways. The context of the `RequestedAttribute` element depends on the eID used.
## How it works
You can define the `RequestedAttribute` element in a few different ways:
1. In the metadata file, by using `AttributeConsumingService`.
2. In the request, by using a SAML protocol extension in the `AuthnRequest`.
3. In the Signicat Dashboard, by configuring the attributes in the **Products** > **eID and Wallet Hub** > **Advanced** > [**eID Rules**](https://dashboard.signicat.com/bca/eid-rules/) (more information will follow soon).
Below, you find more details and examples for the different mechanisms.
## AttributeConsumingService
When you send an authentication request, Signicat looks up the `AttributeConsumingService` in the metadata file and returns the attributes corresponding to the `RequestedAttribute` elements, as defined in the metadata.
Example of `AttributeConsumingService` with `index="1"` in a metadata file:
```xml {5,6}
Example Service
```
:::note Note
The `isRequired` attribute is not supported and will be ignored.
:::
To use the `RequestedAttribute` defined in the `AttributeConsumingService` of your metadata file, you either pass the `AttributeConsumingServiceIndex` in the `AuthnRequest` or configure a default service, as explained below.
### AttributeConsumingServiceIndex with AuthnRequest
To use a specific service, you include the index value in the `AttributeConsumingServiceIndex` element in your authentication request.
```xml
```
Using the example above, the SAML response will return the user attributes as specified in the `AttributeConsumingService` element with `index="1"` of the metadata file.
### Using a default AttributeConsumingService
Alternatively, you can configure a default service in the metadata. This way, Signicat returns the attributes of the default `AttributeConsumingService` when no `AttributeConsumingServiceIndex` is passed in the `AuthnRequest`.
You can configure a default service in two ways:
- Include `isDefault="true"` in the `AttributeConsumingService` element of your metadata file:
```xml
```
- Add a default service in the **Advanced** tab in the Signicat Dashboard. To do this:
1. Navigate to **Products** > **eID and Wallet Hub** > [**SAML 2.0**](https://dashboard.signicat.com/bca/sp) and select your connection.
2. In the **Advanced** tab, select **+ Add new** next to **Attribute consuming services**.
3. Configure the following fields:
- Enter a **Name** for the default service.
- Enter the **Index** of the service. The index must match a value in the metadata.
- Optional. Enter a **Description**.
- Toggle the **Default** button.
- Add the user attributes you wish to receive by default.
## RequestedAttributes in AuthnRequest
You can specify the sets of user attributes on individual requests by using the SAML 2.0 Protocol Extension for requesting attributes, as explained in the [official specification](https://docs.oasis-open.org/security/saml-protoc-req-attr-req/v1.0/saml-protoc-req-attr-req-v1.0.html).
In your `AuthnRequest` you can define the attributes with the `RequestedAttributes` element.
```xml {4-6}
UserAdministrator
```
:::note Note
The `AttributeValue` element in `RequestedAttributes` is not supported. Therefore, 'User' and 'Administrator' in the example above will be ignored.
:::
### Additional parameters
Apart from regular requested attributes, the `AuthnRequest` to Signicat may contain additional parameters. These allow you to specify advanced aspects of an authentication session like the language or the service to use.
You can pass additional parameters in the `RequestedAttributes` under the `Extensions` object. Here you specify the string the `signicat:param:` as the value of the `Name` field in the `RequestedAttribute` element. If the additional parameter requires you to provide a value, you can pass the value as a string in the `AttributeValue` element.
#### Language
For example, you can specify the language by using the `signicat:param:language` parameter, as shown in the example below:
```xml {4,10}
fi
```
### Prefilled information
When you already know some information about the end-user and you want to display it on the authentication page, you can send the prefilled data in the `RequestedAttribute`.
You can pass prefilled information in your request by using the `signicat:prefilled:parametername` format.
Signicat supports the following attributes to prefill information in your SAML 2.0 request:
:::CustomTable{columnWidths="25% 75%"}
| Attribute | Description |
|:----------|:------------|
| `signicat:prefilled:nin` | National Identification Number (NIN). |
| `signicat:prefilled:mobile` | Mobile number. |
| `signicat:prefilled:dateOfBirth` | Date of birth. |
| `signicat:prefilled:email` | Email address. |
| `signicat:prefilled:username` | Username. |
| `signicat:prefilled:deviceId` | Device ID. |
| `signicat:prefilled:firstName` | First name. |
| `signicat:prefilled:lastName` | Last name. |
| `signicat:prefilled:bankAccountNumber` | Bank account number. |
| `signicat:prefilled:organisation` | Organisation name or identifier. |
:::
Note that an eID might support only a subset of attributes.
#### Example
The following example shows how to prefill information about email address (`signicat:prefilled:email`) and mobile number (`signicat:prefilled:mobile`):
```xml
...
subject@test.com1234567890
```
### Provider scoping
Certain eIDs are comprised of a network of identity providers (or issuers), such as banks, that collectively offer authentication to their customers. You may want to offer your end-users only a limited number of these providers when the end-users authenticate with a specific eID.
To learn more about this feature and see examples for SAML, see the [Provider scoping](/docs/eid-hub/concepts/idp-scoping/?protocol=saml#provider-scoping) documentation.
## Learn more
* [**Set up a SAML connection**](/docs/eid-hub/saml-2-0/saml-metadata): Exchange metadata to set up a SAML connection
* [**SAML examples**](/docs/eid-hub/saml-2-0/saml-examples): Take a look at some SAML examples
---
## Information for Enterprise and Express customers
We support our existing Enterprise and Express Electronic Signing solutions on our new platform. If you are a new customer or have recently migrated to our new platform, see our guide on [setting up an API integration](#set-up-an-api-integration) below.
:::warning Important
**If you are an existing customer but have not yet migrated to our new platform**, please contact Signicat to confirm the correct API for your use case before beginning any integration work. Once you have confirmation, you can find the documentation to use with your established integration here:
[**Enterprise**](https://developer.signicat.com/cs/enterprise/docs/electronic-signatures/)
[**Express**](https://developer.signicat.com/cs/express/docs/signature/)
[**Dokobit**](https://www.dokobit.com/developers)
:::
## Set up an API integration
If you are a new customer or have recently migrated to our new platform, you can now use our existing Enterprise and Express Electronic Signing solutions on our new platform.
Setting up an API integration is the most flexible way of testing our signature solutions. You can use your preferred IDE, Framework, Postman, etc. using credentials provided by Signicat.
:::tip Before you start the integration
Before you set up an API integration, we recommend that you familiarise yourself with the [OpenAPI reference documentation](#api-reference) to learn about available endpoints and their properties.
:::
## Prerequisites
Before you can start making requests to this API, you need to learn how to connect to it. To do this, follow steps 1-3 in the **Connect to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::note What permissions are required?
Ensure that you set permission **Signature API** for your API client.
:::
## Differences between our old and new platforms
Our new platform introduces new endpoints for our established products:
| API | new API URL | old API URL |
| :--- |:--- |:--- |
| Enterprise Sign API | `https://api.signicat.com/enterprise/sign` | `https://id.signicat.com/sign` |
| Express Signature API | `https://api.signicat.com/express/sign` | `https://api.signicat.io/signature` |
| Enterprise SOAP web services gateway | `https://api.signicat.com/enterprise/ws/` | `https://id.signicat.com/ws` |
For more information on differences between our old and new platforms, take a look at our [migration guides](#migration-guides), which provide an overview of the changes.
:::warning Important
Our Enterprise SOAP web services are available to existing customers only. If you are working on a new integration or are planning to upgrade from an older version of our DocumentService, PackagingService or ArchiveService SOAP APIs, we strongly recommend that you use [our RESTful Sign API](/apis/electronic-signing/enterprise/) instead.
:::
## Guides
### Quick start guides
See our quick start guides for our Enterprise and Express APIs.
* [**Enterprise Sign API guide**](https://developer.signicat.com/cs/enterprise/apis/sign/sign-api/#using-the-api): Learn more about available operations and see code examples
* [**Express Signature API guide**](https://developer.signicat.com/cs/express/docs/signature/guides/quick-start/): Learn more about available operations and see code examples
* [**Enterprise DocumentService v3 guide**](https://developer.signicat.com/cs/enterprise/docs/electronic-signatures/guides/get-started/2-learn.html#using-documentservice-soap): Learn more about available operations and see code examples
* [**Enterprise PackagingService v4 guide**](https://developer.signicat.com/cs/enterprise/docs/electronic-signatures/guides/get-started/2-learn.html#using-packagingservice-soap): Learn more about available operations and see code examples
* [**Enterprise ArchiveService v3 guide**](https://developer.signicat.com/cs/enterprise/docs/electronic-signatures/guides/get-started/2-learn.html#using-archiveservice-soap): Learn more about available operations and see code examples
### Migration guides
For more information on differences between our old and new platforms, take a look at our migration guides, which provide an overview of the changes.
* [**Enterprise Electronic Signing migration guide**](/docs/electronic-signing/enterprise-express/migration-guides/enterprise-sign-migration): Migrate to our new Digital Trust Platform
* [**Express Electronic Signing migration guide**](/docs/electronic-signing/enterprise-express/migration-guides/express-sign-migration): Migrate to our new Digital Trust Platform
* [**Sign API v2 terminology differences to our Enterprise signing solution**](/docs/electronic-signing/sign-api-v2/core-concepts/terminology-differences-enterprise)
* [**Sign API v2 terminology differences to our Express signing solution**](/docs/electronic-signing/sign-api-v2/core-concepts/terminology-differences-express)
## API reference
Explore our API reference documentation to look up all API endpoints and properties as well as view sample requests and responses.
* [**Enterprise Sign API reference**](/apis/electronic-signing/enterprise/)
* [**Express Signature API reference**](/apis/electronic-signing/express/)
* [**Enterprise DocumentService v3 API reference**](https://developer.signicat.com/cs/enterprise/apis/sign/documentservice/v3.html)
* [**Enterprise PackagingService v4 API reference**](https://developer.signicat.com/cs/enterprise/apis/sign/packaging-service/v4.html)
* [**Enterprise ArchiveService v3 API reference**](https://developer.signicat.com/cs/enterprise/apis/sign/archiveservice/v3.html)
---
## Enterprise migration guide
We now support our existing Enterprise Electronic Signing solutions on our new Digital Trust Platform (DTP). If you are a new customer or have recently migrated to our new platform, the following guide will provide an overview of the changes.
## Enterprise Sign API
### URL and API authorisation
See our guide on [setting up an API integration](/docs/electronic-signing/enterprise-express/#set-up-an-api-integration).
Our new platform introduces new endpoints for our established products:
:::CustomTable
| API | New API URL | Old API URL |
| :-------------------|:----------------------------------------------|:--------------|
| Enterprise Sign API | `https://api.signicat.com/enterprise/sign` | `https://id.signicat.com/sign` |
:::
### Error responses
Our platform will return error responses in the [Problem Detail RFC format](https://datatracker.ietf.org/doc/html/rfc7807) for all errors that occur before the request is forwarded. The potential errors that can arise before the request is forwarded are:
- 4xx errors
- 5xx errors
- Token validation errors
- Errors relating to validation of the request URL path or parameters
- Errors relating to general validation of correct HTTP verb, URL parameters, payloads, not empty payload if required
- Errors relating to dependencies in our new platform, such as global configuration
If the response `Content-Type` is text or JSON, all URLs containing the full URL of the existing (Enterprise) API will get replaced with a `https://api.signicat.com` URL with the `enterprise` prefix path.
## Enterprise SOAP web services
:::warning Important
Our Enterprise SOAP web services are available to existing customers only. If you are working on a new integration or are planning to upgrade from an older version of our DocumentService, PackagingService or ArchiveService SOAP APIs, we strongly recommend that you use [our RESTful Sign API](/apis/electronic-signing/enterprise/) instead.
:::
### URL and API authorisation
See our guide on [setting up an API integration](/docs/electronic-signing/enterprise-express/#set-up-an-api-integration).
Our new platform introduces new endpoints for our established products:
:::CustomTable
| API | New API URL | Old API URL |
| :-----------------------------------|:----------------------------------------------|:--------------------|
| Enterprise SOAP web services gateway | `https://api.signicat.com/enterprise/ws/` | `https://id.signicat.com/ws/` |
:::
MTLS client certificates are now replaced with a JWT authorisation header using the Bearer scheme. Note that any errors as a result of JWT token validation will produce new error messages, but will retain the SOAP error format.
#### Obtain an access token
To obtain your access token, you use the same process as you would for other REST services on our new platform.
:::info Want to learn more?
To learn how to do this, see the [Obtain an access token](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx#4-obtain-an-access-token) section in the **Connect to Signicat APIs** quick start guide.
:::
#### Using the access token
To use your access token, add it to the SOAP request header in the same way you would for a REST request header.
:::info Want to learn more?
To learn how use access tokens in REST request headers, see the [Make an API request](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx#5-make-an-api-request) section in the **Connect to Signicat APIs** quick start guide.
:::
Refer to your client library documentation for information on how to set the header in your specific case. For example, if you use the Java CXF library, you can set the header through the `requestContext` of `BindingProvider`.
:::tip Note
You need to include a username and password in the payload.
:::
### Uploading documents
If you are an existing customer using [DocumentService v3](https://developer.signicat.com/cs/enterprise/apis/sign/documentservice/v3.html) and [PackagingService v4](https://developer.signicat.com/cs/enterprise/apis/sign/packaging-service/v4.html) and have recently migrated to our new platform, documents are now uploaded to our Sign API's built-in Session Data Storage (SDS) by using the [documents endpoint](pathname:///apis/electronic-signing/enterprise/#tag/document/operation/uploadFileToSds).
For more information, see our guide on [setting up an API integration](/docs/electronic-signing/enterprise-express/#set-up-an-api-integration).
### Retrieving documents
To retrieve documents, use the same endpoints that are established in our REST Sign API:
- For documents in Session Data Storage (SDS), use the [documents endpoint](pathname:///apis/electronic-signing/enterprise/#tag/document).
- For archive documents, use the [archive-documents endpoint](pathname:///apis/electronic-signing/enterprise/#tag/archive-document).
### Error responses
Our platform will return error responses in the [Problem Detail RFC format](https://datatracker.ietf.org/doc/html/rfc7807) for all errors that occur before the request is forwarded. The potential errors that can arise before the request is forwarded are:
- 4xx errors
- 5xx errors
- Token validation errors
- Errors relating to validation of the request URL path or parameters
- Errors relating to general validation of correct HTTP verb, URL parameters, payloads, not empty payload if required
- Errors relating to dependencies in our new platform, such as global configuration
If the response `Content-Type` is text or JSON, all URLs containing the full URL of the existing (Enterprise) API will get replaced with a `https://api.signicat.com` URL with the `enterprise` prefix path.
---
## Express migration guide
We now support our existing Express Electronic Signing solutions on our new Digital Trust Platform (DTP). If you are a new customer or have recently migrated to our new platform, the following guide will provide an overview of the changes.
## URL and API authorisation
See our guide on [setting up an API integration](/docs/electronic-signing/enterprise-express/#set-up-an-api-integration).
Our new platform introduces new endpoints for our established products:
:::CustomTable
| API | new API URL | old API URL |
| :---------------------|:-------------------------------------------|:------------------------------------|
| Express Signature API | `https://api.signicat.com/express/sign` | `https://api.signicat.io/signature` |
:::
## Custom domains
Domain setup is now self-serviceable through our Dashboard. See [our documentation on adding a domain](/docs/dashboard/organisation-management/domains/) for details.
## Signature events
Events such as webhooks are now self-serviceable through our Dashboard. See [our new Events and webhooks documentation](/docs/dashboard/settings/events.mdx) for information on setting up and managing events.
Note that the names and content of the events have changed in our new platform. Additionally, events in our new platform contain no personally identifiable information, only IDs.
The table below shows the differences in event names between our old and new platforms.
:::CustomTable{columnWidths="50% 50%"}
| Old event name | New event name |
| ----------------------------------------| ----------------------------- |
| `document_before_deleted` | `order.tobedeleted` |
| `document_canceled` | `order.canceled` |
| `document_created` | `order.created` |
| `document_deleted` | `order.deleted` |
| `document_expired` | `order.expired` |
| `document_email_opened` | `email.opened` |
| `document_link_opened` | `session.started` |
| `document_packaged` / `document_signed` | `order.completed` |
| `document_partially_signed` | `recipient.completed` |
| `document_read` | `session.document.presented`Note that the `id`property in the event will be the `documentId` from the API. The `documentId` property may be the `documentId` or the `attachmentId`. | The `id`property in the event will be the `documentId` from the API. The `documentId` property may be the `documentId` or the `attachmentId`. |
:::
## Communication (SMS / Email notifications)
Notification settings are now self-serviceable through our Dashboard. See [our Communication service documentation](/docs/dashboard/branding/communication.mdx) for information on managing configurations for SMS messages and email.
## Validating redirect JWT tokens
You can still follow our existing [Redirects guide](https://developer.signicat.com/cs/express/docs/signature/create-document.html#redirects) but we have noted in the guide that you will need to use the URL `https://api.signicat.com/express/sign/jwt/validate` in your [POST request in step 4](https://developer.signicat.com/cs/express/docs/signature/create-document.html#step-4-parse-and-validate-the-jwt-optional) to parse and validate the JWT if you are using our new platform.
## Enabling eIDs
You or your onboarding manager will need to enable the eIDs you want to use in the Signicat Dashboard. To do this, navigate to **Products** > **eID and Wallet Hub** > [**eIDs**](https://dashboard.signicat.com/bca/authn).
## Other changes
- We now use our new [Authentication REST API](/docs/eid-hub/authentication-api/) for authentication-based signing. Therefore the naming of the attributes in the PAdES evidence package (JSON/XML files) have changed slightly. The same is true for the eID attributes included in the `documentSignature.attributes` in the [Signicat Signature API](/apis/electronic-signing/express/).
- If you use our Secure Share service as an add-on, note that the user interface of the latest version of Secure Share will look different from our [old Secure Share service](https://developer.signicat.com/cs/express/docs/share/).
---
## Migration guides(Migration-guides)
For more information on differences between our old and new platforms, take a look at our migration guides, which provide an overview of the changes.
* [**Enterprise Electronic Signing migration guide**](/docs/electronic-signing/enterprise-express/migration-guides/enterprise-sign-migration): Migrate to our new Digital Trust Platform
* [**Express Electronic Signing migration guide**](/docs/electronic-signing/enterprise-express/migration-guides/express-sign-migration): Migrate to our new Digital Trust Platform
* [**Sign API v2 terminology differences to our Enterprise signing solution**](/docs/electronic-signing/sign-api-v2/core-concepts/terminology-differences-enterprise)
* [**Sign API v2 terminology differences to our Express signing solution**](/docs/electronic-signing/sign-api-v2/core-concepts/terminology-differences-express)
---
## Electronic Signing
Signicat's Electronic Signing solutions allow you to digitalise business processes by applying electronic signatures on documents such as contracts and loan agreements. The advantage of our Electronic Signing solutions is the ability to securely identify the user according to EU regulations - a key component for providing compliant electronic signatures.
Signicat's electronic signing solutions are comprised of two services:
* [**Sign API v2**](/docs/electronic-signing/sign-api-v2/): Electronic signatures for both small to medium sized businesses and those within regulated industries
* [**Enterprise and Express**](/docs/electronic-signing/enterprise-express/): Enterprise and Express electronic signing for existing customers
## Features
We offer REST APIs using European identity providers (as well as SMS and Email OTP) for creating electronic signatures on contracts, declarations, forms and other documents.
- OAuth2 for authentication
- Customisable, responsive signing interface
- Authentication-based signing or third-party (native) signing
- Advanced and Qualified Electronic Signatures (AES and QES) as defined by the eIDAS European regulation
- Signed documents in XAdES or PAdES format
- Support for signer queues and workflows
## Use case examples
Signicat's Electronic Signing solutions are built flexibly, to enable you to implement any use case that you might have. Here are some examples of how our different solutions are being used today:
- Signing of PDF documents containing interactive forms
- Signing of short text statements using Signed Statement
- Headless signing of text elements with Consent Signature
- Collecting of signatures on multiple documents at the same time
- Signature forwarding/ approvals
- Handwritten signatures
- Sealing
- Signature validation
- Secure document sharing
- Signicat Dashboard user management
- Business-to-business (B2B) signing and sealing (Merchant signing)
## Support
If you have questions, you can contact us by creating a support ticket in the Signicat Dashboard:
[**Create support ticket**](https://dashboard.signicat.com/contact-us/tickets/new)
---
## Sign API v2 terminology
## Collections and signing sessions
Our Sign API v2 has the concepts of **document collections** and **signing sessions**. A collection can contain one or more signing sessions.
- A **document collection** is a collection of documents that naturally belong together.
- A **signing session** specifies the signer and the documents they are asked to sign, along with other details such as contact details, allowed signing methods, the resulting format (XAdES/PAdES), archiving preferences, subject validation details, 'auth before sign' settings and conditional redirect URLs based on the state of the signing session.
:::note Note
- Learn how to manage multiple documents and signing sessions with document collections in our [Document collections](/docs/electronic-signing/sign-api-v2/features/document-collections/) feature guide.
- Learn more about our [Document collections](pathname:///apis/electronic-signing/sign-api-v2/#tag/Document-collections) and [Signing sessions](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions) endpoints in our API reference.
:::
### Signing sessions spanning several different collections
Signing sessions can include documents from several different collections. If you package a collection, it will only include the signed documents that belong to that collection, not documents from other collections signed in the same signing session.
---
## Core concepts
Understand key terms and how they differ from our previous electronic signature APIs
* [**Sign API v2 terminology**](/docs/electronic-signing/sign-api-v2/core-concepts/concepts/)
* [**Terminology differences to our Enterprise signing solution**](/docs/electronic-signing/sign-api-v2/core-concepts/terminology-differences-enterprise)
* [**Terminology differences to our Express signing solution**](/docs/electronic-signing/sign-api-v2/core-concepts/terminology-differences-express)
---
## Terminology differences to our Enterprise signing solution
## Signing order
**All collections and their associated signing sessions** in our Sign API v2 are the equivalent of a **signing order** in our Enterprise signing solution.
## Task
A **signing session** in our Sign API v2 is the equivalent of a **task** in our Enterprise signing solution.
## User-centric session
**Signing sessions spanning several different collections** in our Sign API v2 are the equivalent of a **user-centric session** in our Enterprise signing solution.
---
## Terminology differences to our Express signing solution
## Documents and signers
A **collection and its associated signing sessions** in our Sign API v2 are the equivalent of the **documents and signers** in our Express signing solution.
---
## Error codes for Sign API v2
# Error codes
When you make a request to Signicat's Sign API v2 and there is an error, you will receive a response with an error message that contains an error code.
If you encounter an error and require assistance, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
The table below shows how to interpret some of the error codes that you might encounter when using the API.
:::tip Error object and generic error codes
In addition to these product-specific error codes, there are generic error codes which are applicable to all Signicat APIs. To learn about these and how the error object looks, see our generic [Error codes](/docs/dashboard/error-codes.mdx) documentation.
:::
:::CustomTable
| Error code | Title | HTTP status | Description |
|-------------------------------|-----------------------------------------------|---------------|---------------------------------------------------------------------------------------------------|
| `document_password_protected` | `Document is password protected` | 400 | The uploaded document is password-protected and cannot be read. |
| `document_encrypted` | `Document is encrypted` | 400 | The uploaded document is encrypted and cannot be read. |
| `document_infected` | `Document is infected` | 400 | The uploaded document was flagged as containing a virus and was rejected for security reasons. |
| `document_contains_javascript`| `Document contains JavaScript` | 400 | The uploaded document contains embedded JavaScript and was rejected for security reasons. |
| `invalid_id_format` | `Supplied parameter was not in UUID format` | 400 | The provided parameter is not a valid UUID. |
:::
---
## Archive
## About this feature
Our Sign API V2 offers an embedded archive feature that allows you to securely store signed documents. This feature ensures that all documents are preserved in compliance with legal requirements.
## Use cases
- Archiving of signed documents
- Setting of retention periods for archived documents
:::tip Note
- To manage archived documents, use our [Signicat Archive](/docs/signicat-archive/) solution.
:::
## Integration details
### Sending a document to the archive
To have the result from the signing session automatically sent to the archive, specify this when you create the signing session.
Add an `archive` object to your HTTP POST request to the [Signing sessions endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions/operation/createSigningSession) and include `sendSignatureResultsToArchive` and `retentionPeriod`. The `retentionPeriod` field is required.
:::tip Note
`retentionPeriod` must be an ISO 8601 duration string (for example `P1Y` for one year).
:::
#### Request example
The following is an example of an `archive` object within an HTTP POST request to the [Signing sessions endpoint:
```json
{
"archive": {
"sendSignatureResultsToArchive": true,
"retentionPeriod": "P1Y"
},
"...": "other signing session fields"
}
```
### Archive confirmation and tracking
When archiving completes, the service returns an `archiveId`. Receipt of an `archiveId` confirms that the signature result was archived successfully.
:::warning Important
You must retain the `archiveId` in your system. We strongly recommend storing the `archiveId` together with relevant signer identifiers or business references so you can trace which signer signed which document and retrieve the archived object later.
:::
### Managing archived documents
Our Sign API v2 can send packaged results to an archive, but advanced archive operations are handled by our standalone Signicat Archive solution. See our [Signicat Archive](/docs/signicat-archive/) documentation for the API reference and endpoints.
You can use our Signicat Archive API for:
- Object submission
- Object archiving
- Tagging of archived objects
- Searching for archived objects
- Retrieval of archived objects
- Updating of archived objects
- Object reports
- Object audit logs via API
- Retention management
---
## Document collections
## About this feature
Our Sign API V2 introduces the concept of the **document collection**, which provides a flexible way to group and manage documents throughout the signing process, with automatic packaging capabilities upon completion.
## Use cases
- **Multi-phase signing processes** where signers may be added incrementally.
- **Flexible signing scenarios** where the complete signer list may not be known upfront.
## Technical benefits
- **Scalable document management** through collection-based organisation
- **Automated compliance** via merchant certificate sealing
- **Workflow flexibility** during the active signing phase
- **Asynchronous processing** for improved system performance
- **Clear lifecycle management** with defined closure upon completion
## Core concepts
### Document collection structure
- A document collection serves as a container that can hold one or more documents that naturally belong together.
- Each document within a collection can be referenced by one or more signing sessions.
- The relationship between signing sessions and documents follows a many-to-one pattern, where multiple signing sessions can reference a single document that belongs to a document collection.
### Automatic packaging and sealing functionality
Document collections include the `packageTo` concept, which enables automatic packaging and sealing:
- **Automatic packaging**: When all signing sessions referenced by documents in a document collection are completed, the system automatically packages them into a PAdES (PDF Advanced Electronic Signatures) format
- **Merchant certificate sealing**: The packaged PAdES is sealed using a merchant certificate for authenticity and integrity
- **Optional and asynchronous**: The `packageTo` field is optional and operates asynchronously, allowing for flexible workflow management
### Dynamic session management
Document collections follow these rules during the signing lifecycle:
- Pre-package flexibility: New signing sessions can be created and can reference new document collections until the packaging process has been completed.
- Workflow continuity: This allows for dynamic addition of signers or documents during the active signing phase.
- Collection closure: Once the document collection has been packaged, it becomes closed and no new signing sessions can be created that reference documents from that collection.
## Limitations
### Packaging configuration limitations
Only one level of PAdES packaging is supported - either at the signing session level or at the document collection level, but not both. This means that you must not set the `packageTo` field on a *signing session* if it references documents from a *document collection* that has `packageTo` PAdES set.
This conflict is difficult to validate upfront because document collections only own and manage *documents*, not the signing sessions themselves. A signing session may contain documents from different document collections with different `packageTo` configurations. It's therefore important to ensure proper coordination between signing session and document collection packaging settings.
### Future enhancements
A planned enhancement will introduce functionality to **package individual PAdES results from signing sessions into a Signicat PAdES container**, where each signing session's PAdES (or Xades if `packageTo` is not set) will be included as an attachment within the final packaged document.
---
## Features and functionality
You can learn about Sign API v2 features and functionality in our feature guides.
* [**Archive**](/docs/electronic-signing/sign-api-v2/features/archive): Learn how to securely store signed documents in compliance with legal and regulatory requirements
* [**Document collections**](/docs/electronic-signing/sign-api-v2/features/document-collections): Learn how to manage multiple documents and signing sessions with document collections
* [**Merchant signing**](/docs/electronic-signing/sign-api-v2/features/merchant-signing): Learn how to implement business-to-business (B2B) signing with merchant certificates
* [**Signature forwarding**](/docs/electronic-signing/sign-api-v2/features/signature-forwarding): Learn how to allow end-users to delegate signing sessions to others
* [**Simple text signing**](/docs/electronic-signing/sign-api-v2/features/simple-text-signing): Learn how to implement simple text signing with Sign API v2
---
## Merchant signing
## About this feature
Merchant signing, also known as business-to-business (B2B) signing or sealing, allows you to sign documents using a merchant certificate from a selected vendor. This is useful for automated signing processes where a legal entity, rather than an individual person, is the signer.
:::warning Limitation
The only vendor currently available for merchant signing is **Norwegian BankID** (`NBID`).
:::
## Configuration and setup
To use merchant signing, Signicat Support will need to set up the client configuration for the selected vendor for you. This process will differ slightly between vendors.
For vendor-specific details and configuration, see the relevant documentation:
* [**Norwegian BankID Merchant signing**](/identity-methods/nbid/integration-guide/sign-nbid/#merchant-signing): Vendor-specific merchant signing details
## Use cases
- **Automated sealing**: Automatically sign outgoing documents (like invoices or contracts) with your company's merchant certificate to ensure authenticity and integrity.
- **B2B signing**: Sign documents on behalf of your organisation in a B2B context.
- **XML signing**: Sign XML messages for services like Løsøreregisteret (Brønnøysundregistrene) using the XAdES format.
- **Mixed signing flows**: Combine merchant signing with end-user signing. For example, a document can first be signed by an individual and then sealed by the organisation.
## How it works
Unlike the standard signing process in our Sign API v2, merchant signing does not use document collections or signing sessions. Instead, you make an API call to our [Merchant signing endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Merchant-signing/operation/merchantSign) that returns the signed document immediately.
### Integration steps
The process for merchant signing consists of three steps:
1. **Upload the document**: Make an HTTP POST request with the document's binary data to the [Documents endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Documentsoperation/uploadDocument). This returns a `documentId`.
2. **Perform merchant signing**: Make an HTTP POST request to the [Merchant signing endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Merchant-signing/operation/merchantSign) with the `documentId` and the desired `vendor`. This returns a `documentResultId`.
3. **Download the result**: Make an HTTP GET request using the `documentResultId` to the [Documents endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Documents/operation/getDocument) to download the signed document.
:::tip Note
Since both the original document and the signed result are not connected to a "parent" object (like a signing session), they are not stored long-term in our system. We recommend downloading the result immediately after signing.
:::
### Request example
To perform merchant signing, make an HTTP POST request to the [Merchant signing endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Merchant-signing/operation/merchantSign):
```json
{
"vendor": "NBID",
"toBeSignedDocuments": [
{
"documentId": "d1234567-89ab-cdef-0123-456789abcdef",
"mimetype": "application/pdf",
"format": "PADES",
"description": "Invoice #12345"
}
]
}
```
### Response example
The API returns an array of results, one for each document in the request:
```json
[
{
"documentId": "d1234567-89ab-cdef-0123-456789abcdef",
"documentResultId": "0197d5cb-d683-7451-9b21-1a2da906b353"
}
]
```
You can then use the `documentResultId` to download the signed document, as described in our [integration guide](/docs/electronic-signing/sign-api-v2/integration-guide/#7-download-the-signed-document).
### Signing already signed documents
Merchant signing can be performed on documents that have already been signed, provided they meet certain criteria:
- There is a strict validation of the certificate chain, and Signicat only supports a specific list of trust anchors.
- Documents already signed through Signicat can be mixed with merchant signing.
### XAdES support for XML documents
You can use the [Merchant signing endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Merchant-signing/operation/merchantSign) to sign XML messages using the XAdES format. This is particularly useful for Business-to-Business (B2B) services that require signed XML payloads, such as Løsøreregisteret (Brønnøysundregistrene).
#### 1. Prepare the XML document
Before uploading the document, you must prepare the base XML payload. Add an empty node as the last child of the root node to hold the signatures. This node can be named anything (for example, ``, as in the example below). It acts as a placeholder where the XAdES signature will be injected after the signing process is complete.
##### Example payload
```xml
...
```
#### 2. Upload the document
Currently, our document storage service does not natively support XML document types. Therefore, when you upload the XML document to the Documents endpoint, you must set the `Content-Type` header to `text/plain`.
#### 3. Request the merchant signature
Once the document is uploaded and you have the `documentId`, you can request the signature by calling the Merchant signing endpoint.
In the request body, specify the `format` as `XADES` and the `mimetype` as `text/xml`.
##### Example request
```json
{
"vendor": "NBID",
"toBeSignedDocuments": [
{
"documentId": "d1234567-89ab-cdef-0123-456789abcdef",
"mimetype": "text/xml",
"format": "XADES",
"description": "Invoice #12345"
}
]
}
```
#### 4. Retrieve the signed document
The response format for this request is identical to the default merchant signing response. When you retrieve the final signed document, the previously empty `` node from our example payload will now be populated with the generated `` data.
##### Example result document
```xml
...
...
```
:::tip Note
You can find provider-specific Sign API v2 integration guides in our ID methods documentation:
- [Norwegian BankID](/identity-methods/nbid/integration-guide/sign-nbid.mdx)
- [Swedish BankID](/identity-methods/sbid/integration-guide/sign-sbid.mdx)
:::
---
## Signature forwarding
## About this feature
Signature forwarding allows end-users to send a signing session to another person and nominate that person as a signer. This feature is particularly useful in business-to-business (B2B) contexts where the initial recipient of a signing request may not be the authorised signer, or where multiple individuals need to be involved in a signing process sequentially.
When a session is forwarded, a new, independent signing session is created for the recipient and linked back to the original. This new child session is a copy of the parent session (including documents, UI and redirect settings, authentication setup and archiving configuration), with the new recipient set as its signer. This parent-child relationship is tracked via the `session.forwarding.parentSessionId` and `session.forwarding.childSessionIds` properties, allowing each session to trace which session it was forwarded from and which session it was forwarded to.
## Use cases
- **Business-to-business (B2B)**: A company representative receives a contract but does not have the legal authority to sign it, so they forward it to an authorised person within their organisation.
## How it works
When signature forwarding is enabled, the end-user will see a **Forward** option in the **More actions** dropdown menu at the top right of the signing interface.
Selecting this opens a form where it's possible to delegate the signing responsibility. The original sender will be informed of this action.
### Integration steps
The process for signature forwarding consists of three steps:
1. **Initiating a forward**: The original recipient fills out the form with the following details:
1. **Name**: The name of the recipient of the forwarded session.
2. **Email**: The email address of the recipient of the forwarded session.
3. **Message**: An optional custom message to be included in the notification email.
4. **Sender**: The name of the sender of the forwarded session
2. **Session tracking**: Submitting the form creates a new child signing session. The original parent session is updated with a `childSessionIds` property containing the ID of the new session. The new child session will have a `parentSessionId` property, linking it back to the original.
3. **Preventing further forwarding**: The new child session is created with its own forwarding capability disabled to prevent daisy-chaining.
Once the form is submitted, the new child session is initially created in a blocked state and becomes active once fully set up. This triggers the email notification containing the custom message and a link to review and sign the document to the recipient of the forwarded session.
### Configuration and setup
:::tip Note
Using this feature requires the `SIGN-FORWARD` product entitlement to be enabled on your account.
:::
When you create a signing session, add the relevant parameters to the request body in your HTTP POST request to the [Signing sessions endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions/operation/createSigningSession).
To configure signature forwarding, include the `forwarding` object in your `createSigningSession` request with the following properties:
- **`flow`**: Set this to `FORWARD_AND_CONTINUE` to enable forwarding. The default value is `NONE`, which disables the feature.
- **`senderAddress`** (optional): The email address from which forwarding notifications are sent. This requires a custom domain configured for your account; otherwise, notifications are sent from the default `noreply@signicat` address.
### Request example
The following is an example of a `createSigningSession` request body to initiate the parent session (session A) with forwarding enabled:
```json {17-19}
{
"title": "Le doc",
"documents": [
{
"documentCollectionId": "{{collectionId}}",
"action": "SIGN",
"documentId": "{{documentId}}"
}
],
"senderDisplayName": "Some sender",
"externalReference": "abc-123",
"signingSetup": [
{
"signingFlow": "AUTHENTICATION_BASED"
}
],
"forwarding": {
"flow": "FORWARD_AND_CONTINUE"
}
}
```
### Response example before forwarding
A successful request returns a `201 Created` status code and the initial `SigningSession` object for the parent session (session A). At this stage, the nested `forwarding` block confirms that the feature is enabled but shows no active delegations:
* **`flow`**: Confirms that forwarding is active (`FORWARD_AND_CONTINUE`).
* **`childSessionIds`**: An empty list (`[]`) because the end-user has not yet forwarded their signing invitation.
```json {49-52}
{
"id": "019fd706-2377-7ef5-bf60-3e656986dc23",
"signatureUrl": "https://sign-customer-local.sandbox.signicat.dev/sign?sessionId=019fd706-2377-7ef5-bf60-3e656986dc23",
"title": "Le doc",
"dueDate": "2026-09-05T12:22:11.333920635Z",
"documents": [
{
"documentCollectionId": "019fd705-bd8e-7cf9-973d-2c9c778dc094",
"action": "SIGN",
"documentId": "019fd705-af77-7b6e-8562-97dbc4dd3a1f"
}
],
"lifecycle": {
"state": "READY",
"stateIsFinal": false
},
"senderDisplayName": "Some sender",
"output": {
"signatures": [],
"packages": [],
"userInfo": {
"extra": {}
},
"seals": []
},
"externalReference": "abc-123",
"signingSetup": [
{
"identityProviders": [],
"signingFlow": "AUTHENTICATION_BASED",
"additionalParameters": {},
"requestedAttributes": []
}
],
"subsequentTo": [],
"packageTo": [],
"sealTo": [],
"archive": {
"sendSignatureResultsToArchive": false,
"sendPackagingResultToArchive": false,
"archiveTags": []
},
"ui": {
"hideWelcomeScreen": false,
"minimalTextMode": false
},
"intentionText": {},
"usageTags": [],
"forwarding": {
"flow": "FORWARD_AND_CONTINUE",
"childSessionIds": []
}
}
```
### Response example after forwarding
Once the end-user delegates the signing, retrieving the parent session (session A) via a `GET` request shows the newly established link to the delegated session. The key change occurs within the `forwarding` block:
* **`childSessionIds`**: Now contains the server-generated ID of the child session (session B).
```json {50-55}
{
"id": "019fd706-2377-7ef5-bf60-3e656986dc23",
"signatureUrl": "https://sign-customer-local.sandbox.signicat.dev/sign?sessionId=019fd706-2377-7ef5-bf60-3e656986dc23",
"title": "Le doc",
"dueDate": "2026-09-05T12:22:11.333921Z",
"documents": [
{
"documentCollectionId": "019fd705-bd8e-7cf9-973d-2c9c778dc094",
"action": "SIGN",
"documentId": "019fd705-af77-7b6e-8562-97dbc4dd3a1f"
}
],
"lifecycle": {
"state": "READY",
"stateIsFinal": false
},
"senderDisplayName": "Some sender",
"output": {
"signatures": [],
"packages": [],
"userInfo": {
"extra": {}
},
"seals": []
},
"externalReference": "abc-123",
"signingSetup": [
{
"identityProviders": [],
"signingFlow": "AUTHENTICATION_BASED",
"additionalParameters": {},
"requestedAttributes": []
}
],
"subsequentTo": [],
"packageTo": [],
"sealTo": [],
"archive": {
"sendSignatureResultsToArchive": false,
"sendPackagingResultToArchive": false,
"archiveTags": []
},
"ui": {
"hideWelcomeScreen": false,
"minimalTextMode": false
},
"intentionText": {},
"notifications": [],
"usageTags": [],
"forwarding": {
"flow": "FORWARD_AND_CONTINUE",
"childSessionIds": [
"019fd70d-0ca0-7795-b94a-bac33f18c1be"
]
}
}
```
### Response example for the forwarded session
When you retrieve the newly created child session (session B) via a `GET` request, the payload contains the configuration inherited from session A, along with new properties representing the new signer's context:
* **`signer`**: Populated with the new recipient's details (such as the email address `"test.testerson@testcat.test"`).
* **`notifications`**: Contains the `FORWARDING_NOTIFICATION` structure configured for emailing the new signer.
* **`forwarding`**: The `flow` is set to `"NONE"` to prevent further forwarding (as chains are not allowed). The `parentSessionId` points back to the parent session (session A), creating a clear, two-way cryptographic link.
``` json {38-42,54-63,65-69}
{
"id": "019fd70d-0ca0-7795-b94a-bac33f18c1be",
"signatureUrl": "https://sign-customer-local.sandbox.signicat.dev/sign?sessionId=019fd70d-0ca0-7795-b94a-bac33f18c1be",
"title": "Le doc",
"dueDate": "2026-09-05T12:22:11.333921Z",
"documents": [
{
"documentCollectionId": "019fd705-bd8e-7cf9-973d-2c9c778dc094",
"action": "SIGN",
"documentId": "019fd705-af77-7b6e-8562-97dbc4dd3a1f"
}
],
"lifecycle": {
"state": "READY",
"stateIsFinal": false
},
"senderDisplayName": "Some sender",
"output": {
"signatures": [],
"packages": [],
"userInfo": {
"extra": {}
},
"seals": []
},
"externalReference": "abc-123",
"signingSetup": [
{
"identityProviders": [],
"signingFlow": "AUTHENTICATION_BASED",
"additionalParameters": {},
"requestedAttributes": []
}
],
"subsequentTo": [],
"packageTo": [],
"sealTo": [],
"signer": {
"email": "test.testerson@testcat.test",
"prefill": [],
"validations": [],
"restrictUse": []
},
"archive": {
"sendSignatureResultsToArchive": false,
"sendPackagingResultToArchive": false,
"archiveTags": []
},
"ui": {
"hideWelcomeScreen": false,
"minimalTextMode": false
},
"intentionText": {},
"notifications": [
{
"category": "FORWARDING_NOTIFICATION",
"communicationMethod": "EMAIL",
"tags": [],
"message": {
"language": "en"
}
}
],
"usageTags": [],
"forwarding": {
"flow": "NONE",
"parentSessionId": "019fd706-2377-7ef5-bf60-3e656986dc23",
"childSessionIds": []
}
}
```
## Limitations
- A signing session can be forwarded a maximum of **5 times**.
- A forwarded session cannot itself be forwarded (no chains).
- The `forwarding` and `signer.validations` properties cannot be used together in the same session.
- Forwarding is blocked if the session's document collections have hit their reference limit.
- Notifications from the original session are not carried over to the new session.
---
## Simple text signing
## About this feature
Simple text signing lets you capture a lightweight, binding confirmation from an end-user after they authenticate with an eID method. The signature is produced without a full document-based signing ceremony. Instead, the
system records the authenticated end-user's identity together with the text they agreed to.
## How it works
1. You create a signing session specifying that the session uses simple text signing.
2. The end-user is redirected to authenticate with one of the supported eID methods.
3. Optional: Some values can be prefilled and shown to the end-user.
4. The end-user reviews the text you supplied in the session request.
5. The end-user confirms their consent.
6. The API returns a signed result object that includes the agreed text, signing metadata and identity information.
## Core API elements
### Create signing session request
When you create a signing session, add the relevant parameters to the request body in your HTTP POST request to the [Signing sessions endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions). These parameters determine what the end-user sees and how the flow behaves.
Example fields you can include:
- Parameters that enable simple text signing
- Optional prefill configuration
- Optional UI configuration
### Prefilling (optional)
Simple text signing supports prefilling of login-related fields when the end-user authenticates. Currently this applies to the national identification number (NIN) only.
When enabled, additional login hints are collected from the authentication step. Prefilled values are shown to the end-user as part of the simple text signing screen. Prefill content varies by eID method, depending on what each method exposes.
You can enable this behaviour through an optional parameter in your [signing session request](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions):
``` json
"signer": {
"nationalIdentificationNumber": "12345678910",
"prefill": [
"NATIONAL_IDENTIFICATION_NUMBER"
]
}
```
### User interface behaviour
You can specify two optional UI parameters that let you adjust how the flow appears.
#### Hide welcome screen (optional)
When `hideWelcomeScreen` is set to `true`, the welcome screen is not shown. The end-user is taken directly to the content that needs to be signed.
To hide the welcome screen, include the following in your [signing session request](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions):
``` json
"ui": {
"hideWelcomeScreen": true
}
```
#### Minimal text mode (optional)
When `minimalTextMode` is set to true, a stripped down version of the signing interface is shown. Note that this only works if only a single `plain/text` document is included in the signing session.
To use minimal text mode, include the following in your [signing session request](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions):
``` json
"ui": {
"minimalTextMode": true
}
```
## Signed result format
After the user confirms the simple text, the API returns a signed result object that includes:
- The text that was signed
- Metadata about the signing
- Details retrieved from the authentication method
- Identity attributes available from the eID provider
### Response example
``` json
"signatures": [
{
"resultDocumentId": "019a3001-8f98-7e84-bb28-162a2c9059c5",
"resultArchiveId": "id here" // if sendSigningResultsToArchive
"originalDocumentId": "019a2ff4-cab0-7a61-b74e-dff3e9b2c18a",
"signatureType": "XADES"
}
],
```
---
## Sign API v2
Our Sign API v2 is a REST API using European identity providers for creating electronic signatures on contracts, declarations, forms and other documents.
## Core capabilities
- **OAuth2 for authentication**: Secure API authorisation using the industry standard.
- **Customisable, responsive signing interface**: Tailor the signing flow and appearance to match your brand's look and feel across all devices.
- **Standardised output formats**: Generate electronically signed files in compliant **XAdES** (XML Advanced Electronic Signatures) or **PAdES** (PDF Advanced Electronic Signatures) formats.
## Use case examples
- **Collecting of signatures on multiple documents at the same time**: Coordinate complex signature workflows where multiple signers need to sign several related documents (such as rental or loan agreements).
- **Business-to-business (B2B) signing and sealing (Merchant signing)**: Support sealing and signing transactions involving corporate invoices and certificates, registration and de-registrations in public movables registry, as well as company registrations.
- **Frictionless consent capturing**: Record binding user consent for terms and conditions, GDPR updates or simple text statements.
- **Long-term compliance & auditing**: Automatically transfer finalised signed contracts to a tamper-proof repository with strict retention management.
- **Signicat Dashboard user management**: Securely control who can configure, monitor or manage your Sign API v2 integrations.
## Features and functionality
We provide standalone guides for specialised functionality:
* [**Archive**](/docs/electronic-signing/sign-api-v2/features/archive): Learn how to securely store signed documents in compliance with legal and regulatory requirements
* [**Document collections**](/docs/electronic-signing/sign-api-v2/features/document-collections): Learn how to manage multiple documents and signing sessions with document collections
* [**Merchant signing**](/docs/electronic-signing/sign-api-v2/features/merchant-signing): Learn how to implement business-to-business (B2B) signing with merchant certificates
* [**Signature forwarding**](/docs/electronic-signing/sign-api-v2/features/signature-forwarding): Learn how to allow end-users to delegate signing sessions to others
* [**Simple text signing**](/docs/electronic-signing/sign-api-v2/features/simple-text-signing): Learn how to implement simple text signing with Sign API v2
{/*
## Try it out
* [**Demo**](): Try it out using our preconfigured demo service
* [**Test in Dashboard**](): Learn how to test our Sign API v2 with your sandbox account and find available test users
*/}
## Guides
{/* * [**Initial preparations**](): Learn about preparations before you start integrating */}
* [**Integration guide**](/docs/electronic-signing/sign-api-v2/integration-guide): Follow step-by step guides to integrate with our Sign API v2
* [**Features and functionality**](/docs/electronic-signing/sign-api-v2/features/): Explore the features and functionality of our Sign API v2
* [**Signing methods**](/docs/electronic-signing/sign-api-v2/signing-methods): Browse supported authentication-based and PKI signing methods
## API reference
Explore our Sign API v2 reference documentation to look up all API endpoints and properties as well as view sample requests and responses.
* [**Sign API v2 API reference**](/apis/electronic-signing/sign-api-v2): Regulatory compliant electronic signatures
## Support
* [**Core concepts**](/docs/electronic-signing/sign-api-v2/core-concepts/): Understand key terms and how they differ from our previous electronic signature APIs
* [**Error codes**](/docs/electronic-signing/sign-api-v2/error-codes): Learn how to interpret error codes from Sign API v2
* [**Release notes**](/docs/electronic-signing/sign-api-v2/release-notes): Read about the latest Sign API v2 features and functionality
To learn more, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
---
## Sign API v2 integration guide
## Set up an API integration
Setting up an API integration is the most flexible way of testing our signature solutions. You can use your preferred IDE, framework, Postman, etc. using credentials provided by Signicat.
:::tip Before you start the integration
Before you set up an API integration, we recommended that you familiarise yourself with the most common integration [use cases](/docs/electronic-signing/sign-api-v2/#use-case-examples) and the [OpenAPI reference documentation](/apis/electronic-signing/sign-api-v2/) to learn about available endpoints and their properties.
If you are looking for an automated business-to-business (B2B) signing and sealing process that does not require end-user interaction, see our [Merchant signing](/docs/electronic-signing/sign-api-v2/features/merchant-signing) feature guide.
:::
## Using the API
The most basic signature process will consist of the following steps:
1. [Prerequisites](#1-prerequisites).
2. [Upload a document](#2-upload-a-document).
3. [Create a document collection](#3-create-a-document-collection).
4. [Create a signing session](#4-create-a-signing-session).
5. [Redirect the end-user to the signature application](#5-redirect-the-end-user-to-the-signature-application).
6. [Get the result from the signing session](#6-get-the-result-from-the-signing-session).
7. [Download the signed document](#7-download-the-signed-document).
:::tip Note
The code snippets below are kept brief for clarity and are provided as examples, not production code. For example, error handling is omitted.
:::
### 1. Prerequisites
Before you can start making requests to this API, you need to learn how to connect to it. To do this, follow steps 1-3 in the **Connect to Signicat APIs** [Quick start guide](/docs/dashboard/connect-to-signicat-apis/quick-start-guide.mdx).
:::note What permissions are required?
Ensure that you set permission **Signature API** for your API client.
:::
### 2. Upload a document
Once you have obtained an access token, you're ready to upload your first document to be signed. We support both PDFs and plain text documents, and the operation is as simple as making an HTTP POST request with the document's binary data to the [Documents endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Documents) of the API. There is no Base64 conversion or similar. You simply read the document as binary data and send it directly to the server.
:::warning Important
We do not currently support signing of already signed PDFs or text files for authentication-based signing. If an end-user tries to sign an already signed document, the signing process may fail.
We do support signing already signed PDF files with PKI signing (for example, [Norwegian BankID PKI signing](/identity-methods/nbid/integration-guide/sign-nbid/#limitations)).
:::
#### Request example in Python
``` Python
def upload_document(access_token, filename, content_type='application/pdf'):
url = 'https://api.signicat.com/sign/documents'
document_headers = {
'content-type': content_type,
'authorization': 'Bearer ' + access_token,
}
with open(filename, 'rb') as file:
response = requests.post(url, headers=document_headers, data=file)
return response.json()['documentId']
```
In the code snippet above, you can see that we're extracting and returning the `documentId` from the response JSON.
#### Response example
The full response to the [POST request to the Documents endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Documents/operation/uploadDocument) looks like this:
``` json
{
"mimeType": "application/pdf",
"documentId": "0197d5cb-d683-7451-9b21-1a2da906b353",
"createdAt": "2025-07-04T14:16:35.202871056Z",
"documentHash": {
"hash": "Y2QyOGVkNGMzZjUwNzU3OWQzMTM4YmRiZjRiOTU0MWViNGQ0MGI2MjAzNGMzNzFlNzg3ZGM1YmU0OGE0MzBlZg==",
"hashAlgorithm": "SHA256"
}
}
```
If you want to upload a text document instead, just change the `content-type` header to `text/plain`.
:::tip Note
The document will remain on the server for 30 minutes, after which it will be deleted unless it has been used in a subsequent signing session.
Once you add the document to a signing session, the session determines the document's retention period. By default, documents in a signing session are kept for 45 days.
:::
### 3. Create a document collection
Once you have uploaded the document, the next step is to create a document collection. A document collection is a logical grouping of documents that will be signed together. This allows you to manage multiple documents in a single signing session.
:::tip Note
- For more information on the concepts and terminology of the API, see our [Sign API v2 terminology](/docs/electronic-signing/sign-api-v2/core-concepts/concepts/) page.
- Learn how to manage multiple documents and signing sessions with document collections in our [Document collections](/docs/electronic-signing/sign-api-v2/features/document-collections/) feature guide.
:::
In this tutorial, the document collection only has a single document in it. To create the document collection, you make a [POST request to the Document collections endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Document-collections/operation/createDocumentCollection) with a JSON structure containing the `documentId` you obtained in the previous step.
#### Request example in Python
``` python
def create_document_collection(access_token, document_id):
url = 'https://api.signicat.com/sign/document-collections'
document_collection_headers = {
'content-type': 'application/json',
'authorization': 'Bearer ' + access_token,
}
data = {
"documents": [
{
"documentId": f"{document_id}",
}
]
}
response = requests.post(url, headers=document_collection_headers, data=json.dumps(data))
return response.json()['id']
```
In the code snippet above, you are returning the `id` of the document collection response, since you'll be needing it in the next step.
#### Response example
The full response to the [POST request to the Document collections endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Document-collections/operation/createDocumentCollection) has the following format:
``` json
{
"id": "0197d5cb-dbbd-7e4d-b95c-9f2920882733",
"documents": [
{
"documentId": "0197d5cb-d683-7451-9b21-1a2da906b353"
}
]
}
```
### 4. Create a signing session
Equipped with the `documentId` and the `documentCollectionId` you previously obtained, you're now ready to create a signing session, which specifies the details for the end-user experience as well as the outcome of the signature process.
To create a signing session, you need to make an HTTP POST request to the [Signing sessions endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions) with a JSON structure that includes the `documentId` and the `documentCollectionId`. The best way to illustrate how this is done, in its simplest form, is to look at some example code.
#### Request example in Python
``` python
def create_sign_session(access_token, document_collection_id, document_id):
external_reference = str(uuid.uuid4())
url = 'https://api.signicat.com/sign/signing-sessions'
sign_session_headers = {
'content-type': 'application/json',
'authorization': 'Bearer ' + access_token,
}
data = [
{
"title": "The title of the signing session",
"externalReference": f"{external_reference}",
"documents": [
{
"action": "SIGN",
"documentCollectionId": f"{document_collection_id}",
"documentId": f"{document_id}"
}
],
"signingSetup": [
{
"identityProviders": [{
"idpName": "ftn"
}],
"signingFlow": "AUTHENTICATION_BASED"
}
],
"packageTo": ["PADES_CONTAINER"],
"ui": {
"language": "fi",
},
"redirectSettings": {
"error": f"https://www.example.com?q=error&externalReference={external_reference}",
"cancel": f"https://www.example.com?q=cancel&externalReference={external_reference}",
"success": f"https://www.example.com?q=success&externalReference={external_reference}"
}
}
]
response = requests.post(url, headers=sign_session_headers, data=json.dumps(data))
return response.json()[0]['id'], response.json()[0]['signatureUrl']
```
The following is an explanation of each field and its role in the request:
- `title`: All signing sessions must have a title. In certain end-user configurations, this title will be displayed to the end-user. An example of an appropriate title could be "Rental agreement between X and Y".
- `externalReference`: This field is intended for you to put your own internal identifier on the signing session, so that you can correlate it with the relevant process on your side. Note also that in this example, we're appending the external reference parameter to the redirect URLs so that, when the end-user returns to our application, we will know the context of the signature.
- `documents`: In our simple one-document scenario, this array contains a single object with three fields:
- `documentCollectionId` and `documentId` identify the document.
- `action` specifies what the end-user is expected to do: Here, it's `SIGN`.
- `signingSetup`: This array contains the options for the signature process:
- `identityProviders` specifies which identity providers should be available to choose from for the end-user. If you don't specify this, then all configured identity providers on the account will be shown as options. In our example, we are using Finnish Trust Network (FTN).
- In our simple scenario, we set `signingFlow` to `AUTHENTICATION_BASED`. Other options are available but omitted here for brevity.
- `requestedAttributes` (optional): You can request identity provider-specific extra attributes by including a `requestedAttributes` array inside the `signingSetup` object. If supported by the IdP, the requested `requestedAttributes` will then be available under `output.userInfo.extra` in the signing session GET response. The following example requests two `nbid` attributes:
```json
"signingSetup": [
{
"identityProviders": [
{
"idpName": "nbid"
}
],
"signingFlow": "AUTHENTICATION_BASED",
"requestedAttributes": ["nbidAuthTime", "nbidSubjectUuid"]
}
]
```
Note: Not all attributes are guaranteed to be available for every IdP. Availability depends on the IdP, user consent, and IdP-side behaviour. Contact your Signicat account manager or [Signicat Support](https://www.signicat.com/contact/contact-support) for current attribute availability.
:::tip Note
You can find provider-specific Sign API v2 integration guides in our ID methods documentation:
- [Norwegian BankID](/identity-methods/nbid/integration-guide/sign-nbid.mdx)
- [Swedish BankID](/identity-methods/sbid/integration-guide/sign-sbid.mdx)
:::
- `packageTo`: Here, we want the signed document to be a PAdES (PDF Advanced Electronic Signatures), so we set it to `PADES_CONTAINER`.
- `ui`: The settings in this object will affect the user interface, for example `language`.
- `redirectSettings`: This object specifies where the end-user should be redirected after signing. It is not mandatory to set redirect URLs. If you do not specify them, the end-user will terminate the signature process at a completion page provided by Signicat.
- `usageTags` and `notifications` (optional): These objects allow you to attach tags to a signing session to help correlate events and outgoing messages with your systems.
- `usageTags` can be forwarded with billing and usage events so you can subscribe or filter events by tag. See our [Events and webhooks documentation](/docs/dashboard/settings/events.mdx) for more information on events and how to set up a webhook subscription.
- `notifications` can be included with outgoing communication messages (email, SMS) so that messages can be correlated or filtered by tag. You can also define the content of the message, including sender details, headers and the text itself.
The following example shows how you can configure both usage tags and notifications:
```json
{
"usageTags": [
"billing-tag-project-alpha",
"event-tag-h1-2026-report"
],
"notifications": [
{
"communicationMethod": "EMAIL",
"category": "SIGNING_NOTIFICATION",
"tags": ["new-hire-contract", "email-notification"],
"message": {
"language": "en",
"header": "Your document is ready for signing",
"text": "Please review and sign the attached document.",
"senderName": "HR Department",
"senderAddress": "hr@yourcompany.com"
}
},
{
"communicationMethod": "SMS",
"category": "SIGNING_NOTIFICATION",
"tags": ["urgent-signing", "sms-notification"],
"message": {
"language": "en",
"text": "Urgent: A document requires your signature."
}
}
]
}
```
:::tip Note
For more information on the available properties, see the schema definitions for `NotificationMessage` and `NotificationMessageContent` under the [Signing sessions endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions) in our API reference.
:::
For more information on all available fields and their purpose, see [our Sign API v2 reference](/apis/electronic-signing/sign-api-v2).
#### Response example
The response to the [POST request to the Signing sessions endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions/operation/createSigningSession) will be a full JSON structure in the following format:
``` json
[
{
"id": "0197d5fb-d3ce-70c0-a420-68972e1c4d57",
"signatureUrl": "https://example.sandbox.signicat.com/sign?sessionId=0197d5fb-d3ce-70c0-a420-68972e1c4d57",
"title": "The title of the signing session",
"dueDate": "2025-08-03T15:09:00.139911468Z",
"documents": [
{
"documentCollectionId": "0197d5fb-d2bd-780a-8102-dd126ad41396",
"action": "SIGN",
"documentId": "0197d5fb-cc53-7514-8f69-df73c879f22c"
}
],
"lifecycle": {
"state": "READY",
"stateIsFinal": false
},
"output": {
"signatures": [],
"packages": []
},
"externalReference": "85950a80-aba0-453d-be77-f75d20adbc9e",
"signingSetup": [
{
"identityProviders": [{ "idpName": "ftn" }],
"signingFlow": "AUTHENTICATION_BASED",
"additionalParameters": {}
}
],
"subsequentTo": [],
"packageTo": [
"PADES_CONTAINER"
],
"ui": {
"language": "fi"
},
"redirectSettings": {
"error": "https://www.example.com?q=error&externalReference=85950a80-aba0-453d-be77-f75d20adbc9e",
"cancel": "https://www.example.com?q=cancel&externalReference=85950a80-aba0-453d-be77-f75d20adbc9e",
"success": "https://www.example.com?q=success&externalReference=85950a80-aba0-453d-be77-f75d20adbc9e"
}
}
]
```
In our example, we are mostly interested in the signing session `id`, as well as the `signatureUrl` which we will use to redirect the end-user. In a real-world application, you would typically store at least the signing session `id` and the `externalReference` in a database so that you can correlate them later.
### 5. Redirect the end-user to the signature application
Once you have created the signing session, you can direct the end-user to the `signatureUrl` provided in the response. This URL will take them to the signing interface where they can complete (or cancel) the signing process. You then wait for the user to return to your application.
### 6. Get the result from the signing session
In our example, we would like the signed document to be a signed PDF, a PAdES document. We refer to the process of converting the raw, signed document to a PAdES as **packaging**, meaning that the document is packaged into a PAdES container for easy viewing in supported PDF readers.
However, packaging is an asynchronous process. This means that when the end-user returns to your application after signing, the PAdES is most likely not produced yet. The time it takes to complete the packaging is not guaranteed, so you should not poll API endpoints to await the result and keep the end-user waiting in the meantime, as the user experience would suffer. Instead, you set up a webhook in order to get notified when packaging has been completed.
#### Configure a webhook subscription
Setting up a webhook is a simple operation that you manage yourself in the [Signicat Dashboard](https://dashboard.signicat.com). To learn how to do this, see the [Add a subscription](/docs/dashboard/settings/events.mdx#add-a-subscription) section in our **Events and webhooks** documentation.
In our example, we have set up a webhook subscription for the events 'Packaging completed' and 'Packaging failed', under the 'Signature' label in the Dashboard.
When packaging has completed, our application receives a webhook message with the following payload:
``` json
{
"id": "5ddcfab1-31a9-4660-b0b6-63eecebcedfc",
"timestamp": "2025-07-04T15:51:58.8654531Z",
"eventName": "package.completed",
"sender": "signature",
"eventData": {
"id": "0197d5fb-d3ce-70c0-a420-68972e1c4d57",
"externalId": "85950a80-aba0-453d-be77-f75d20adbc9e"
},
"accountId": "a-spge-aCVRlHJKfdhjkhscfd40",
"expiresAt": "2025-07-04T15:53:58.8654527Z",
"isMockEvent": false,
"tags": []
}
```
Inside the `eventData`, we find the `id`, which is the signing session ID and `externalId`, which is the `externalReference`. At this point, we will now call the Signing sessions endpoint to retrieve the document ID of the PAdES document and then we will download it.
#### Retrieve the document ID of the PAdES document
To retrieve the document ID of the PAdES document, you need to make an [HTTP GET request to the Signing sessions endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions/operation/getSigningSession) using the signing session ID you received in the webhook.
##### Request example in Python
``` python {11-13}
def get_sign_session(access_token, session_id):
url = f"https://api.signicat.com/sign/signing-sessions/{session_id}"
sign_session_headers = {
'authorization': 'Bearer ' + access_token,
}
response = requests.get(url, headers=sign_session_headers)
sign_session_response = json.loads(response.content)
output = sign_session_response.get('output', {})
packages = output.get('packages', [])
pades = packages[0] if packages else None
pades_document_id = pades.get('resultDocumentId') if pades else None
return pades_document_id
```
In the code snippet above, shown on lines 11-13, we extract the document ID of the PAdES from the response.
##### Response example
The response to the [GET request to the Signing sessions endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions/operation/getSigningSession) is, again, the full signing session data structure, which will now contain updated information regarding the status of the process, as well as the relevant document identifiers.
``` json
{
"id": "0197d5fb-d3ce-70c0-a420-68972e1c4d57",
/* REMOVED FOR BREVITY */
"lifecycle": {
"state": "SIGNED",
"stateIsFinal": true
},
"output": {
"signatures": [
{
"resultDocumentId": "0197d623-1dae-7ea6-88f9-8474d83dbf97",
"originalDocumentId": "0197d622-d70d-73de-8e73-d3f742c8d881",
"signatureType": "XADES"
}
],
"packages": [
{
"packageId": "0154e96f-4ff8-448b-bd22-6401cfa13180",
"resultDocumentId": "0197d623-2b90-75e5-be3b-138fe89dfe38",
"packageType": "PADES_CONTAINER"
}
]
},
/* REMOVED FOR BREVITY */
}
```
### 7. Download the signed document
All that remains now is to download the PAdES document. To download the PAdES, you need to make an HTTP GET request to the [Documents endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Documents) of the API using the document ID you obtained in the previous step.
#### Request example in Python
``` python
def download_document(access_token, document_id):
url = f'https://api.signicat.com/sign/documents/{document_id}'
document_headers = {
'authorization': 'Bearer ' + access_token,
}
response = requests.get(url, headers=document_headers)
return response.content
```
The response contains the binary content of the PAdES document. You can now save it as a PDF file to complete the process.
## Other integration details
### Signing by multiple signers
You can also use the Sign API v2 to have the same document signed by multiple signers. This process builds on the single-signature flow described above, but with key differences depending on whether you are using **Authentication-based** or **PKI-based** signing.
#### Authentication-based signing (parallel)
For authentication-based signing (for example, Freja, MitID, FTN, iDIN, SMS OTP, Email OTP), the process allows multiple signers to sign a document in parallel.
The process consists of the following steps:
1. [Upload a document](#2-upload-a-document) and [create a document collection](#3-create-a-document-collection) as described in steps 2 and 3 above.
2. For each person who needs to sign, create a separate signing session by making an HTTP POST request to the [Signing sessions endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Signing-sessions). Use the **same** `documentCollectionId` and `documentId` for each request.
3. Each request will return a unique `signatureUrl`. Distribute each URL to the corresponding signer.
4. After all parties have signed, you retrieve the final document from the parent document collection. See the section on [Retrieving the signed document for multi-sign](#retrieving-the-signed-document-for-multi-sign) for more information.
#### PKI-based signing (sequential)
For PKI-based signing, the underlying signature technology requires signatures to be applied sequentially.
- **Norwegian BankID PKI signing**: We support a flexible, unordered signing workflow with an automatic locking mechanism. See the section on [Flexible, unordered signing with locking mechanism](#flexible-unordered-signing-with-locking-mechanism) below for more details.
- **Other PKI-based signing methods**: (For example, Swedish BankID PKI signing) For other PKI methods, parallel signing sessions on the same document are not supported. Signers must sign sequentially. You must create a signing session, wait for the signature, and then use the signed result document to start the next signing session.
#### Flexible, unordered signing with locking mechanism
When using Norwegian BankID PKI, multiple signers can sign the document in any order (unordered signing). Because PKI signing requires modifying the document sequentially, Sign API v2 handles this using an automatic **locking mechanism for Norwegian BankID PKI signing**. You can now send a document to multiple signers at the same time without setting a predefined signing order:
1. Upload your document and create a document collection.
2. For each person who needs to sign, create a separate signing session by making an HTTP POST request to the [Signing sessions endpoint](/apis/electronic-signing/sign-api-v2/#tag/Signing-sessions). Use the **same** `documentCollectionId` and `documentId` for each request.
3. Distribute the unique `signatureUrl` returned in the response to the corresponding signers.
4. The signers can access the document in any order.
##### User experience (Locking)
Since the system still technically seals the signatures sequentially in the background, only one signer can actively sign the document at a time.
If a signer attempts to sign while another is already doing so, the system will temporarily lock the session and display a message asking them to try again shortly.
#### Retrieving the signed document for multi-sign
When a document has been signed by multiple signers, you do not download the result from one of the individual signing sessions. Instead, you must retrieve it from the parent document collection.
1. Get the document collection by its ID:
Make an HTTP GET request to the [Document collections endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Document-collections/operation/getDocumentCollection), using the `collectionId` you used for all the signing sessions.
2. Extract the `resultDocumentId`:
In the response, you will find a `resultDocumentId` field. This ID points to the final PAdES document containing all the signatures.
**Response example**
```json
{
"id": "019914ae-53c9-7012-a868-2d047c27bc8c",
"documents": [
{
"documentId": "01990a8b-9bf4-7f6c-8b02-67557b096ed8",
"description": "Terms of Service"
}
],
"resultDocumentId": "019914b0-1234-5678-9abc-3e058d28ad9d"
}
```
3. Download the final document:
Use the `resultDocumentId` from the previous step to download the document by making an HTTP GET request to the [Documents endpoint](pathname:///apis/electronic-signing/sign-api-v2/#tag/Documents/operation/getDocument), as described in [Step 7. Download the signed document](#7-download-the-signed-document). This will give you the single PDF file with all signatures applied.
### Signature forwarding
Signature forwarding allows end-users to send a signing session to another person and nominate that person as a signer.
For more information and a detailed example, see our [Signature forwarding](/docs/electronic-signing/sign-api-v2/features/signature-forwarding) feature guide.
### Simple text signing
Simple text signing allows you to present a plain text string for the user to sign instead of a PDF document. This is ideal for scenarios like confirming terms and conditions or approving simple statements.
For more information and a detailed example, see our [Simple text signing](/docs/electronic-signing/sign-api-v2/features/simple-text-signing) feature guide.
### Merchant signing
Merchant signing (also known as sealing) allows your organisation to sign or seal documents automatically without any end-user interaction. This is typically used for business-to-business (B2B) processes, such as issuing electronic invoices, receipts or certificates that require a digital seal from the company.
For more information and a detailed example, see our [Merchant signing](/docs/electronic-signing/sign-api-v2/features/merchant-signing) feature guide.
## API reference
Explore our Sign API v2 reference documentation to look up all API endpoints and properties as well as view sample requests and responses.
* [**Sign API v2 API reference**](/apis/electronic-signing/sign-api-v2): Regulatory compliant electronic signatures
---
## Release notes for Sign API v2
# Sign API v2 release notes
{/* TEMPLATE
### DD.MM.YYYY
Expand/collapse release notes
#### New features
- *Summary.* Text goes here.
#### Improved
- *Summary.* Text goes here.
#### Resolved issues
- *Summary.* Text goes here.
---
*/}
## 2026
### 07.07.2026
Expand/collapse release notes
#### New features
- Swedish BankID (`sbid`) Public Key Infrastructure (PKI) signing
#### Improved
- Support for flexible, unordered signing with Norwegian BankID (`nbid`) PKI signing
### 03.03.2026
Expand/collapse release notes
#### New features
- Merchant signing: Support for business-to-business (B2B) signing with Norwegian BankID
### 06.01.2026
Expand/collapse release notes
#### New features
- Archive: Added support for archiving functionality via the `archive` object
## 2025
### 31.10.2025
Expand/collapse release notes
#### Improved
- Improved PAdES (PDF Advanced Electronic Signatures) accessibility for European Accessibility Act (EAA) compliance
### 31.10.2025
Expand/collapse release notes
#### New features
- Added support for additional eID methods for signing
### 14.10.2025
Expand/collapse release notes
#### New features
- Expanded Signicat Dashboard capabilities for our Sign API v2:
- Support for Elasticsearch for document name and document tags
- Added quick filters
- Expanded session details
- Enhanced error handling
#### Improved
- Further enhancements on accessibility in the signing interface, aligning with Web Content Accessibility Guidelines (WCAG) standards
### 30.09.2025
Expand/collapse release notes
#### New features
- Norwegian BankID (`nbid`) Public Key Infrastructure (PKI) signing
- Support for `SignText` field
- `additionalParameters` supported for `mitid_app_type` to enable app switching
- Support for `NO_USE` for `nationalIdentityNumber`
- Separate packaging endpoint
- Support for artifacts
### 11.09.2025
Expand/collapse release notes
#### New features
- Launched [Signicat Dashboard](https://dashboard.signicat.com) capabilities for our Sign API v2
- Added ability to search for and filter sessions and collections
#### Improved
- Enhanced accessibility in the signing interface, aligning with Web Content Accessibility Guidelines (WCAG) standards
### 19.08.2025
Expand/collapse release notes
#### New features
- Internal groundwork completed for future improvements and new features
- Backwards compatibility in UI for Express API features
#### Resolved issues
- Miscellaneous bug fixes and minor improvements
### 14.08.2025
Expand/collapse release notes
#### Improved
- Monitoring and resilience improvements
#### Resolved issues
- Miscellaneous bug fixes
### 20.06.2025
Expand/collapse release notes
#### New features
- Support for certificate-based signing (through Buypass) now includes:
- Support for Norwegian BankID
#### Improved
- Accessibility compliance improvements
### 19.05.2025
Expand/collapse release notes
#### Improved
- Miscellaneous improvements
### 29.04.2025
Expand/collapse release notes
#### New features
- Initial support for Dutch eID methods DigID and iDIN
### 11.04.2025
Expand/collapse release notes
#### New features
- Support for subject validation on a person's national identity number
#### Improved
- UI improvements
### 28.02.2025
Expand/collapse release notes
#### New features
- Initial support for certificate-based signing (through Buypass)
#### Improved
- UI improvements for mobile devices
## 2024
### 13.12.2024
Expand/collapse release notes
#### New features
- Support for multiple documents
- Support for multiple signers
- PAdES (PDF Advanced Electronic Signatures) output
### 31.10.2024
Expand/collapse release notes
#### New features
- Initial support for phone flow signing with Swedish BankID
#### Improved
- UI improvements for use on mobile devices
- New field `signatureURL` in the signing session response
#### Resolved issues
- Miscellaneous bug fixes
### 17.10.2024
Expand/collapse release notes
#### Improved
- UI improvements for use on mobile devices
#### Resolved issues
- Miscellaneous bug fixes
### 25.09.2024
Expand/collapse release notes
#### New features
- Single user, signing a single document producing an LTV-SDO (long-term validation signed data object) as evidence
- End-user notifications when an action is needed
- Customer-facing events channel for signing session state changes and creation
---
To learn more, you can contact us by [creating a support ticket](https://dashboard.signicat.com/contact-us/tickets/new) in the Signicat Dashboard.
---
## Signing methods
Our Sign API v2 supports two main forms of electronic signatures:
1. **Authentication-based signing** (where the signature is backed by a verified authentication event) and
2. **PKI signing** (where the signature is cryptographically generated natively by the electronic identity scheme).
## Authentication-based signing
**Authentication-based signing** supports the use of any type of authentication method provided by Signicat, where the authentication result is used for signing. This ensures a unified output format in accordance with EU specifications, as well as a scalable, responsive signing interface supporting all modern device standards and window sizes.
Authentication-based signing enables you to sign one or more documents by first consenting to the contents of the document(s) and subsequently authenticating yourself using one of a number of eID providers.
As the product relies on authentication, the eID providers do not need to support signing themselves. Our Sign API v2 gathers proof of the signer's actions, i.e. viewing the document(s), consenting to the contents and the authentication itself. The series of proofs is combined with each of the original documents.
The result is a signed XML document (XAdES), which is digitally signed by Signicat. Each original document results in one XAdES document for each signer. The signed documents can also be merged into a final PAdES (PDF Advanced Electronic Signatures) document.
### Supported authentication-based signing methods
:::CustomTable
| eID method | Description |
| :--- | :--- |
| [Freja](/identity-methods/freja/) | Freja eID |
| [MitID personal](/identity-methods/mitid/) | MitID for private entities |
| [MitID business](/identity-methods/mitid/) | MitID for business entities |
| [FTN](/identity-methods/ftn/) | Finnish BankID and Mobile-ID |
| [IDIN](/identity-methods/idin/) | Digital identification service developed by the Dutch banking sector |
| [SMS OTP](/identity-methods/sms-otp/) | SMS one-time password (OTP): A code sent to the signer's mobile device to confirm their identity. |
| [Email OTP](/identity-methods/email-otp/) | Email one-time password (OTP): A code sent to the signer's email address for verification. |
:::
{/* | [DigiD](/identity-methods/digid/) | (abbreviation for Digitale Identificatie) is the Dutch government's universal online digital identity system, allowing residents to securely authenticate themselves when using public services | */}
{/* | [eHerkenning](/identity-methods/eherkenning/) | Standardised digital identity and login system for businesses and organisations in the Netherlands - essentially the corporate equivalent of DigiD | */}
## PKI signing
**Public Key Infrastructure (PKI) signing** allows you to sign documents using the natively available signing capabilities of specific eID providers.
In a PKI signing flow, the signature is cryptographically bound to the document using private keys managed by the eID provider or stored securely on the user's device (such as a hardware security module or smartcard). This produces a highly secure, non-repudiable signature compliant with local regulatory standards. The resulting signature can then be verified directly against the provider's trust infrastructure or packaged into standard PAdES containers.
### Supported PKI signing methods
:::CustomTable
| eID method | Description |
| :--- | :--- |
| [Norwegian BankID](/identity-methods/nbid/integration-guide/sign-nbid) | Norwegian BankID PKI signing |
| [Swedish BankID](/identity-methods/sbid/integration-guide/sign-sbid) | Swedish BankID PKI signing |
:::
{/* | [Freja](/identity-methods/freja/) | eID operating out of Sweden. Has multiple level signature products. | */}
{/* | InkSign / Handwritten | InkSign allows signers to draw their signature on a touchscreen device, such as a smartphone or tablet. This signature is then embedded into the digital document, providing a visual representation of the signer's intent to agree to the document's contents. | */}
## UI and technical differences
While standard authentication-based signing offers a uniform UI across methods, the end-user experience with PKI-based signing (`PKISIGNING`) depends on the provider and document type.
### Norwegian BankID
For Norwegian BankID, the PKI-based signing flow looks similar in the UI to signing with `AUTHENTICATION_BASED` and selecting only the `nbid` eID. However, there are significant differences with PKI signing:
- With `PKISIGNING`, the system creates signing certificates for Cloud Signature Consortium (CSC) solutions.
- `PKISIGNING` provides QES-compliant signatures while `AUTHENTICATION_BASED` does not.
- When the authentication is complete, the end-user will see a consent screen where they must give their consent before being redirected back to the signing interface or to the `redirectUri` defined in the signing session.
### Swedish BankID
The behaviour of the end-user interface for Swedish BankID PKI signing depends on the number and type of documents you are signing.
#### Signing a single text document
When signing a single text document, Signicat's signing interface is skipped entirely and the end-user is redirected to the BankID application.
- The document content (the text to be signed) is displayed directly within the Swedish BankID app. You must provide the text content for the document.
- You can optionally provide an intention text that appears above the document content. If you do not provide one, the default value "You are about to sign the following document(s):" is displayed.
The following is an example of the BankID application view for text documents:
#### Signing multiple documents or PDFs
When signing multiple documents (all text, all PDFs or a combination), Signicat's signing interface is displayed to the user before they are redirected to the Swedish BankID app.
- The signing interface shows a preview of the documents to the user.
- For PDF files, the file preview is not available in the BankID app itself. Instead, you can provide contextual text using the `signText` field in the `SigningSession` object. For example: "You are signing the document Agreement.pdf".
- This contextual text supports Markdown formatting and is displayed in the BankID app. If no text is provided, a default message is shown.
The following is an example of the BankID application view when contextual text is provided for a PDF:
---
## Identity document verification API
# Assure API integration
Learn how to integrate with different eIDV services, including PictureID, ReadID, VideoID, Onfido and WebID, through the Assure API.
This page provides an overview of possible ways of integrating with the Assure API to verify the identity of a person using an ID document.
:::note Prerequisites
We assume you already know your client_id and client_secret and also have the access token (`OIDC_ACCESS_TOKEN`) that is required for calling each endpoint. This is described in the [Quick start guide](/docs/id-document-and-biometric-verification/quick-start-guides/quick-start-guide-assure-api/#set-up-an-api-integration).
It is also assumed that you have access to the Assure API at some environment.
:::
## Introduction to the API
* [**Key concepts**](/docs/id-document-and-biometric-verification/assure-api/key-concepts): Read about the key concepts in the Assure API before you start to integrate
* [**General usage recommendations**](/docs/id-document-and-biometric-verification/assure-api/usage-recommendations/): Read about important setup recommendations before you start to integrate
* [**Choose your preferred integration flow**](/docs/id-document-and-biometric-verification/assure-api/integration-flows): Choose either the generic or the alternative flow (web only)
## Integration guides
* [**Integration guide for Assure API**](/docs/id-document-and-biometric-verification/assure-api/integration-steps): Follow these common steps for all providers
* [**Provider-specific integrations**](/docs/id-document-and-biometric-verification/provider-specific-integrations/): Step by step setup instructions for each provider (PictureID, ReadID, VideoID, Onfido, WebID)
## Service details
* [**Assure API services and endpoints**](/docs/id-document-and-biometric-verification/services/): Read more about central services for Assure API
## API Reference
The Signicat Assure API is a single point of integration across [eIDV services](/docs/id-document-and-biometric-verification/#eidv-services). It enables you to combine a wide range of identity document verification mechanisms such as NFC reading of passports, fully automated verification using AI and manual verification performed by agents, based on the specific requirements for each individual end-user identity being verified.
* [**Assure API**](/apis/id-document-and-biometric-verification/): Signicat's API for verifying identity documents
---
## Choose an integration flow
This topic provides an overview of the flows for integrating with the Assure API and the use of its services.
You can choose between the following flows:
- [eIDV generic flow](#eidv-generic-flow)
- [eIDV alternative flow (web only)](#eidv-alternative-flow-web-only)
:::warning Important
Your mobile/web app must always communicate with your own server and never directly with the Assure API. For more recommendations, see the [General usage recommendations page].
:::
## eIDV generic flow
By integrating with the Assure API, you enable an end-user to perform electronic identity verification using their identity document on your web/native mobile app.
The generic flow for integrating this service can be illustrated as follows:
```mermaid
sequenceDiagram
title eIDV generic data flow
participant FE as Service provider frontend
participant BE as Service provider backend
participant Assure as Assure API
participant eIDV as eIDV verification provider
rect rgb(247, 249, 252)
note left of FE: 1. Initial setup
BE->>Assure: Create dossier
Assure-->>BE: dossierId
BE->>Assure: Create process (dossierId, provider)
Assure-->>BE: processId, authorizationUrl
end
rect rgb(247, 249, 252)
note left of FE: 2. Upload ID images
alt
FE-->>eIDV: Alternative A: Use provider's SDK to capture and upload images (authorization token)
else
BE->>Assure: Alternative B: Upload images via backend
Assure-->>eIDV: Forward images
end
end
rect rgb(247, 249, 252)
note left of FE: 3. Request verification
BE->>Assure: Start verification (dossierId, processId)
Assure-->>eIDV: Forward verification request
end
rect rgb(247, 249, 252)
note left of FE: 4. Get result
eIDV-->>Assure: Verification result
Assure->>BE: process.complete event (dossierId, processId, status)
BE->>Assure: Get process (dossierId, processId)
Assure-->>BE: Process final result information
end
```
### Step 1: Initial setup
Use the [Create dossier](pathname:///apis/id-document-and-biometric-verification/#tag/Dossiers/operation/createDossier) endpoint to create a placeholder for all of your end-user's data:
```sh
curl -X POST \
/assure/dossiers \
-H 'Accept: application/json' \
-H 'Authorization: Bearer eyJh ... QifQ.eyJ ... hIOw' \
-H 'Content-Type: application/json' \
```
Save the `dossierId` from the response body to use in the next requests.
:::warning Note
Ensure you use one dossier per end-user.
:::
:::tip View the dossier contents
After creating a dossier, you can see all of its contents anytime you want to. To do that, use the [Get dossier](pathname:///apis/id-document-and-biometric-verification/#tag/Dossiers/operation/getDossiers) endpoint giving it the `dossierId`.
:::
Use the [Create process](pathname:///apis/id-document-and-biometric-verification/#tag/Processes/operation/createProcess) endpoint to create an identity verification process inside the dossier.
Ensure you use the `dossierId` from the "Create dossier" response.
The process allows you to request an [eIDV provider](/docs/id-document-and-biometric-verification/provider-specific-integrations/) to perform the verification of an identity document. It is also where all information about the [verification result](#step-4-get-verification-result) is kept.
### Step 2: Upload ID images
Now that you have a dossier and a process, you must provide images of the identity document and of the end-user.
You can do this either by using the provider's SDK to capture and upload the images or by uploading the images directly using the Assure API.
See also [Images](/docs/id-document-and-biometric-verification/services/images.mdx).
### Step 3: Request verification
Now that all the necessary information has been provided, you should [request the verification](pathname:///apis/id-document-and-biometric-verification/#tag/Processes/operation/startVerification).
**Can I upload new ID images to the same process?**
Every time you upload images to a process, they will replace the previous ones.
However, as soon as you request the verification to be performed, no more images should be uploaded. If you need to change the images or any other data, you should discard the current process and create a new one.
### Step 4: Get verification result
At this point, we must wait for a response from the provider with the final result.
Since this response is obtained asynchronously, you may subscribe to [Assure Events](/docs/id-document-and-biometric-verification/services/callbacks.mdx) to be notified when the result is available.
Still, at any time you can see all the available information about an identity document verification by [checking the information in the process](pathname:///apis/id-document-and-biometric-verification/#tag/Processes/operation/getProcess).
**Must I subscribe to Assure Events to get the final result?**
You are not required to subscribe to the [Assure Events](/docs/id-document-and-biometric-verification/services/callbacks.mdx). However, we strongly recommend that you do this, instead of polling Signicat's services.
:::warning Polling risk
Using polling instead of subscribing to events, may put your service at risk due to rate limiting of requests.
:::
The [final result information](/docs/id-document-and-biometric-verification/services/process.mdx#normalised-final-result) is always kept inside the process whether you asked to be notified or not. The event notification only informs you that the verification is finished.
An important feature of the Assure API is that, regardless of the provider you use to perform the identity verification, you always get a normalised final result on any process that is “accepted”. For more information about the process results, see [Get process](/docs/id-document-and-biometric-verification/services/process.mdx).
## eIDV alternative flow (web only)
If you prefer using the provider's SDK to capture and upload the ID images and you are integrating with the Assure API in a web environment, you can deflect integrating with their SDK and alternatively use the Assure API [Capture](pathname:///apis/id-document-and-biometric-verification/#tag/Capture/operation/createArtifact) service.
These services encapsulate the providers' JS SDKs, making it quicker and easier for you to integrate with the Assure API in a web context:
```mermaid
sequenceDiagram
title eIDV alternative data flow
participant FE as Service provider frontend
participant BE as Service provider backend
participant Assure as Assure API
participant eIDV as eIDV verification provider
rect rgb(247, 249, 252)
note left of FE: 1. Initial setup
BE->>Assure: Create dossier
Assure-->>BE: dossierId
BE->>Assure: Start capture flow (dossierId, provider, redirectUrl)
Assure-->>BE: url
BE-->>FE: Redirect end-user to url
end
rect rgb(247, 249, 252)
note left of FE: 2. Image upload + verification
FE->>eIDV: End-user is redirected to SDK, uses it to capture/upload ID images and verification starts
eIDV-->>Assure: Verification response
Assure->>FE: Redirect end-user to redirectUrl+dossierId+processId+status
end
rect rgb(247, 249, 252)
note left of FE: 3. Get result
Assure-->>BE: process.complete event (dossierId, processId, status)
BE->>Assure: Get process (dossierId, processId)
Assure-->>BE: Process final result information
end
```
This flow is a simplification of the [generic eIDV integration flow](#eidv-generic-flow). You don't need to create a process (step 1 in the generic flow), integrate with the provider's SDK / upload the images (step 2 in the generic flow) nor request to start the verification (step 3 in the generic flow). All of these steps are encapsulated in the [Start capture flow](/docs/id-document-and-biometric-verification/services/capture.mdx) service.
:::warning Capture in iframe
For security reasons, Capture will only successfully load inside `