diff --git a/content/altinn-studio/guides/development/eFormidling/_index.en.md b/content/altinn-studio/guides/development/eFormidling/_index.en.md
index b5337658a06..93d75570d37 100644
--- a/content/altinn-studio/guides/development/eFormidling/_index.en.md
+++ b/content/altinn-studio/guides/development/eFormidling/_index.en.md
@@ -20,7 +20,7 @@ Before setting up eFormidling you will need to have the following set up:
### Maskinporten Integration
-In order to enable eFormidling in your application you will need to [setup an integration between your app and Maskinporten](/altinn-studio/guides/integration/maskinporten-app-integration/).
+In order to enable eFormidling in your application you will need to [setup an integration between your app and Maskinporten](/altinn-studio/guides/integration/maskinporten/).
* **NB!** In `Program.cs` add the following instead of what is described in the steps above in the `RegisterCustomAppServices`-method:
diff --git a/content/altinn-studio/guides/development/eFormidling/_index.nb.md b/content/altinn-studio/guides/development/eFormidling/_index.nb.md
index a35b86d3f55..58b61be2057 100644
--- a/content/altinn-studio/guides/development/eFormidling/_index.nb.md
+++ b/content/altinn-studio/guides/development/eFormidling/_index.nb.md
@@ -20,7 +20,7 @@ Before setting up eFormidling you will need to have the following set up:
### Maskinporten Integration
-In order to enable eFormidling in your application you will need to [setup an integration between your app and Maskinporten](/altinn-studio/guides/integration/maskinporten-app-integration/).
+In order to enable eFormidling in your application you will need to [setup an integration between your app and Maskinporten](/altinn-studio/guides/integration/maskinporten/).
* **NB!** In `Program.cs` add the following instead of what is described in the steps above in the `RegisterCustomAppServices`-method:
diff --git a/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.en.md b/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.en.md
index 5c4049fa722..5397af11760 100644
--- a/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.en.md
+++ b/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.en.md
@@ -31,7 +31,7 @@ required prerequisites are met.
owner.*
If step 2 and 3 of the technical requirements are missing see
-section [Maskinporten-App Integration](../../../integration/maskinporten-app-integration)
+section [Maskinporten-App Integration](../../../integration/maskinporten)
\* _If the end user of application A have the required roles to instantiate application B on behalf of the intended
recipient, you can skip these technical requirements_
diff --git a/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.nb.md b/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.nb.md
index 61c4d2b75e9..3f7e72c3153 100644
--- a/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.nb.md
+++ b/content/altinn-studio/guides/development/multi-app-solution/instructions/_index.nb.md
@@ -30,7 +30,7 @@ Før du starter på den tekniske implementeringen, må du sørge for at de nødv
som skal sende forespørsler til en annen applikasjon, hvor forespørslene må autoriseres av applikasjonenseier.*
Hvis trinn 2 og 3 av de tekniske kravene mangler, se
-seksjonen [Maskinporten-App Integrering](../../../integration/maskinporten-app-integration)
+seksjonen [Maskinporten-App Integrering](../../../integration/maskinporten)
\* _Hvis sluttbrukeren av applikasjon A har de nødvendige rollene for å instansiere applikasjon B på vegne av den
tiltenkte
diff --git a/content/altinn-studio/guides/integration/correspondence/_index.en.md b/content/altinn-studio/guides/integration/correspondence/_index.en.md
new file mode 100644
index 00000000000..85726109a34
--- /dev/null
+++ b/content/altinn-studio/guides/integration/correspondence/_index.en.md
@@ -0,0 +1,36 @@
+---
+title: Integrate an Altinn app with Correspondence
+linktitle: Correspondence
+description: How to setup an integration between an Altinn App and Correspondence.
+weight: 100
+toc: true
+---
+
+This guide details how to integrate the [correspondence messaging service](/correspondence/) with an Altinn application.
+This integration enables an app to securely send digital messages and attachments to both organisations and individuals.
+
+## Prerequisites
+1. An applicable [Altinn resource](#altinn-resource)
+2. [Altinn.App.Api](https://www.nuget.org/packages/Altinn.App.Api) and [Altinn.App.Core](https://www.nuget.org/packages/Altinn.App.Core) _v8.5.0_ or greater
+
+### Altinn Resource
+When sending a correspondence, it needs to be tied to an Altinn resource. This resource controls the access policy for
+the Correspondence, which is evaluated for both senders and receivers.
+
+Please refer to the [resource registration guide](/correspondence/getting-started/service-owner/#register-a-resource-in-altinn-resource-registry)
+for more information on the setup process.
+
+{{}}
+The resource needs to allow sender access for [your organisation](https://github.com/Altinn/altinn-cdn/blob/master/orgs/altinn-orgs.json)
+and recipient access for the appropriate [role codes](https://github.com/Altinn/altinn-cdn/blob/master/authorization/subjectoptions.json).
+
+Note that for messages sent to a person, the code `priv` should be used. For messages sent to an organisation, whichever roles
+best describing your indented recipient should be used.
+{{}}
+
+## Implementation and usage
+In order to use the correspondence service, the request must be authorised with an appropriate bearer token and a subscription key.
+
+Please refer to the sections below for a detailed guide on how to achieve this:
+
+- [Sending correspondence using Maskinporten](maskinporten)
\ No newline at end of file
diff --git a/content/altinn-studio/guides/integration/correspondence/_index.nb.md b/content/altinn-studio/guides/integration/correspondence/_index.nb.md
new file mode 100644
index 00000000000..22a7efa0fc7
--- /dev/null
+++ b/content/altinn-studio/guides/integration/correspondence/_index.nb.md
@@ -0,0 +1,36 @@
+---
+title: Integrasjon av Altinn-app med Meldingstjenesten
+linktitle: Meldingstjenesten
+description: Hvordan sette opp en integrasjon mellom en Altinn-app og Meldingstjenesten.
+weight: 100
+toc: true
+---
+
+Denne veiledningen beskriver hvordan du integrerer [meldingstjenesten](/correspondence/) med en Altinn-applikasjon.
+En slik integrasjon gjør det mulig for en app å sende digitale meldinger og vedlegg sikkert til både organisasjoner og enkeltpersoner.
+
+## Forutsetninger
+1. En [Altinn-ressurs](#altinn-ressurs)
+2. [Altinn.App.Api](https://www.nuget.org/packages/Altinn.App.Api) og [Altinn.App.Core](https://www.nuget.org/packages/Altinn.App.Core) _v8.5.0_ eller nyere
+
+### Altinn-ressurs
+Når du sender en korrespondanse må den knyttes til en Altinn-ressurs. Denne ressursen kontrollerer tilgangsstyring for
+meldinger. Disse evalueres for både avsendere og mottakere.
+
+Vennligst se [veiledningen for ressursregistrering](/correspondence/getting-started/service-owner/#register-a-resource-in-altinn-resource-registry)
+for mer informasjon om oppsett og opprettelse.
+
+{{}}
+Ressursen må tillate sender-tilgang for [din organisasjon](https://github.com/Altinn/altinn-cdn/blob/master/orgs/altinn-orgs.json)
+og mottaker-tilgang for ønskelige [rollekoder](https://github.com/Altinn/altinn-cdn/blob/master/authorization/subjectoptions.json).
+
+Merk at for meldinger sendt til en person, skal koden `priv` brukes. For meldinger sendt til en organisasjon, skal de rollene
+som best beskriver din tiltenkte mottaker brukes.
+{{}}
+
+## Implementasjon og bruk
+For å bruke meldingstjenesten, må forespørselen autoriseres med en passende bearer-token og en abonnementnøkkel.
+
+Vennligst se seksjonene nedenfor for en detaljert veiledning om hvordan du oppnår dette:
+
+- [Sende meldinger ved hjelp av Maskinporten](maskinporten)
\ No newline at end of file
diff --git a/content/altinn-studio/guides/integration/correspondence/maskinporten.en.md b/content/altinn-studio/guides/integration/correspondence/maskinporten.en.md
new file mode 100644
index 00000000000..638d9681277
--- /dev/null
+++ b/content/altinn-studio/guides/integration/correspondence/maskinporten.en.md
@@ -0,0 +1,217 @@
+---
+title: Using Maskinporten Authorisation with the Correspondence Service
+linktitle: Using Maskinporten
+weight: 100
+toc: true
+---
+
+On the [previous page](../), we went through how to set up a [resource](../#altinn-resource) and the versioning requirements
+for the correspondence client.
+
+We can now proceed to the [Maskinporten setup](#maskinporten-setup) and the [application code](#application-code).
+
+## Maskinporten Setup
+In order to use the [correspondence service](/correspondence/), a [Maskinporten](/authentication/what-do-you-get/maskinporten/) client with the access to the following scopes is required:
+- `altinn:serviceowner`
+- `altinn:correspondence.read`
+- `altinn:correspondence.write`
+{.correspondence-custom-list}
+
+To set this up, follow the general steps outlined in the [Maskinporten integration guide](../maskinporten/), with a couple of modifications described below.
+- The correspondence client uses a new, internal, client to communicate with Maskinporten. Because of this, the configuration object now looks like this:
+
+ {{< code-title >}}
+ App/appsettings.json
+ {{< /code-title >}}
+
+ ```json
+ "MaskinportenSettings": {
+ "authority": "https://[test.]maskinporten.no/",
+ "clientId": "the client id",
+ "jwkBase64": "base64 encoded jwk"
+ }
+ ```
+- The correspondence client will automatically find and use the Maskinporten client, and attempt to bind to the default
+ `MaskinportenSettings` configuration path.
+- If you require a different configuration path, you can configure it with the `ConfigureMaskinportenClient` extension method:
+
+ {{< code-title >}}
+ App/Program.cs
+ {{< /code-title >}}
+
+ {{}}
+ void RegisterCustomAppServices(
+ IServiceCollection services,
+ IConfiguration config,
+ IWebHostEnvironment env
+ )
+ {
+ services.ConfigureMaskinportenClient(
+ "UniqueMaskinportenSettingsPath"
+ );
+ }
+ {{}}
+- If you require a custom configuration flow, you can make use of the available configuration delegate:
+
+ {{< code-title >}}
+ App/Program.cs
+ {{< /code-title >}}
+
+ {{}}
+ void RegisterCustomAppServices(
+ IServiceCollection services,
+ IConfiguration config,
+ IWebHostEnvironment env
+ )
+ {
+ services.ConfigureMaskinportenClient(config =>
+ {
+ config.Authority = "https://[test.]maskinporten.no/";
+ config.ClientId = "the client id";
+ config.JwkBase64 = "base64 encoded jwk";
+ });
+ }
+ {{}}
+{.connected-bullets}
+
+## Application code
+Using the dependency injection framework in .NET, you can inject an `ICorrespondenceClient` in your service.
+This client can then be used to send correspondences and will be able to automatically handle the Maskinporten authorisation.
+
+When sending a correspondence, there are a wealth of properties available. While only a handful of these are required,
+the process of constructing the request itself can be a bit daunting. To assist with this, there is a
+`CorrespondenceRequestBuilder` interface available.
+
+The example below uses the builder to construct a correspondence request using the most common options: the message itself,
+a notification to the recipient, and an attached file.
+
+You will find all available options and associated documentation through IntelliSense in your favorite code editor.
+
+### Service registration
+
+{{< code-title >}}
+App/Program.cs
+{{< /code-title >}}
+
+{{}}
+// ...
+
+void RegisterCustomAppServices(
+ IServiceCollection services,
+ IConfiguration config,
+ IWebHostEnvironment env
+)
+{
+ services.AddTransient();
+}
+{{}}
+
+### Correspondence client implementation
+
+{{< code-title >}}
+App/CorrespondenceClientDemo.cs
+{{< /code-title >}}
+
+```cs
+using System;
+using System.Threading.Tasks;
+using Altinn.App.Core.Features.Correspondence;
+using Altinn.App.Core.Features.Correspondence.Builder;
+using Altinn.App.Core.Features.Correspondence.Models;
+
+namespace Altinn.App;
+
+internal sealed class CorrespondenceClientDemo(
+ ICorrespondenceClient correspondenceClient
+) : ITheInterfaceYouAreImplementing
+{
+ public async Task SendMessage()
+ {
+ CorrespondenceAuthorisation authorisation = CorrespondenceAuthorisation.Maskinporten;
+ CorrespondenceRequest request = CorrespondenceRequestBuilder
+ .Create()
+ .WithResourceId("A valid resource registry identifier")
+ .WithSender("Sender's organisation number")
+ .WithSendersReference("Sender's arbitrary reference for the correspondence")
+ .WithRecipient("Recipient's organisation number")
+ .WithAllowSystemDeleteAfter(DateTime.Now.AddYears(1))
+ .WithContent(
+ language: "en",
+ title: "Hello from .NET 👋🏻",
+ summary: "The message summary",
+ body: "The message body with markdown support"
+ )
+ .WithNotification(
+ CorrespondenceNotificationBuilder
+ .Create()
+ .WithNotificationTemplate(CorrespondenceNotificationTemplate.CustomMessage)
+ .WithEmailSubject("New Altinn message")
+ .WithEmailBody(
+ "You have a new message in your Altinn inbox, log in to see what's new."
+ )
+ .WithSmsBody("Got 📨 in Altinn")
+ .WithNotificationChannel(CorrespondenceNotificationChannel.EmailPreferred)
+ )
+ .WithAttachment(
+ CorrespondenceAttachmentBuilder
+ .Create()
+ .WithFilename("attachment.txt")
+ .WithName("The attachment 📎")
+ .WithSendersReference("Sender's arbitrary reference for the attachment")
+ .WithDataType("text/plain")
+ .WithData("This is the attachment content"u8.ToArray())
+ )
+ .Build();
+
+ return await correspondenceClient.Send(
+ new SendCorrespondencePayload(request, authorisation)
+ );
+ }
+
+ public async Task GetMessageStatus(Guid correspondenceId)
+ {
+ return await correspondenceClient.GetStatus(
+ new GetCorrespondenceStatusPayload(
+ correspondenceId,
+ CorrespondenceAuthorisation.Maskinporten
+ )
+ );
+ }
+}
+```
+
+### Notes on authorisation
+In the example above, we are using the `CorrespondenceAuthorisation.Maskinporten` enum to indicate that authorisation should
+be automatically handled internally with Maskinporten. This is by far the easiest and most convenient authorisation method, but
+it's not the only option available.
+
+If you require custom authorisation logic while sending correspondences, you are able to supply your own delegate for this purpose.
+
+An example of this could be if you for some reason preferred to use the legacy [external Maskinporten client](https://github.com/Altinn/altinn-apiclient-maskinporten).
+
+Both the `SendCorrespondencePayload` and `GetCorrespondenceStatusPayload` accepts a delegate parameter. The implementation would look something like this:
+
+```cs
+// ...
+
+new SendCorrespondencePayload(
+ request,
+ async () =>
+ {
+ TokenResponse maskinportenResponse = await maskinportenService.GetToken(
+ "base64 encoded jwk",
+ "test|prod",
+ "the client id",
+ "altinn:serviceowner altinn:correspondence.write",
+ null
+ );
+
+ TokenResponse altinnResponse = await maskinportenService.ExchangeToAltinnToken(
+ maskinportenResponse,
+ "test|prod"
+ );
+
+ return JwtToken.Parse(altinnResponse.AccessToken);
+ }
+);
+```
\ No newline at end of file
diff --git a/content/altinn-studio/guides/integration/correspondence/maskinporten.nb.md b/content/altinn-studio/guides/integration/correspondence/maskinporten.nb.md
new file mode 100644
index 00000000000..403fdb0ab95
--- /dev/null
+++ b/content/altinn-studio/guides/integration/correspondence/maskinporten.nb.md
@@ -0,0 +1,214 @@
+---
+title: Bruke meldingstjenesten med Maskinporten-autorisasjon
+linktitle: Med Maskinporten
+weight: 100
+toc: true
+---
+
+På [forrige side](../) gikk vi gjennom hvordan man setter opp en [ressurs](../#altinn-ressurs) og versjonskravene
+for meldingsklienten.
+
+Vi kan nå gå videre til [oppsett av Maskinporten](#maskinporten) og [applikasjonskode](#applikasjonskode).
+
+## Maskinporten
+For å bruke [meldingstjenesten](/correspondence/) behøver man en [Maskinporten](/authentication/what-do-you-get/maskinporten/)-klient med tilgang til følgende scopes:
+- `altinn:serviceowner`
+- `altinn:correspondence.read`
+- `altinn:correspondence.write`
+{.correspondence-custom-list}
+
+For å sette opp dette kan du følge de generelle stegene i [veiledningen for Maskinporten-integrasjons](../maskinporten/) med noen modifikasjoner beskrevet nedenfor.
+- Meldingsklienten bruker en ny, intern klient for å kommunisere med Maskinporten. Derfor blir konfigurasjonsobjektet seende slik ut:
+
+ {{< code-title >}}
+ App/appsettings.json
+ {{< /code-title >}}
+
+ ```json
+ "MaskinportenSettings": {
+ "authority": "https://[test.]maskinporten.no/",
+ "clientId": "the client id",
+ "jwkBase64": "base64 encoded jwk"
+ }
+ ```
+- Meldingsklienten finner og bruker automatisk Maskinporten-klienten, og forsøker å binde seg til standard konfigurasjonssti `MaskinportenSettings`.
+- Hvis du trenger en annen konfigurasjonssti, kan du konfigurere den med hjelp av `ConfigureMaskinportenClient`:
+
+ {{< code-title >}}
+ App/Program.cs
+ {{< /code-title >}}
+
+ {{}}
+ void RegisterCustomAppServices(
+ IServiceCollection services,
+ IConfiguration config,
+ IWebHostEnvironment env
+ )
+ {
+ services.ConfigureMaskinportenClient(
+ "DinUnikeMaskinportenSettingsSti"
+ );
+ }
+ {{}}
+- Hvis du trenger et tilpasset konfigurasjonsoppsett, kan du bruke en delegatmetode:
+
+ {{< code-title >}}
+ App/Program.cs
+ {{< /code-title >}}
+
+ {{}}
+ void RegisterCustomAppServices(
+ IServiceCollection services,
+ IConfiguration config,
+ IWebHostEnvironment env
+ )
+ {
+ services.ConfigureMaskinportenClient(config =>
+ {
+ config.Authority = "https://[test.]maskinporten.no/";
+ config.ClientId = "klient-id";
+ config.JwkBase64 = "base64-kodet jwk";
+ });
+ }
+ {{}}
+{.connected-bullets}
+
+## Applikasjonskode
+Ved å bruke avhengighetsinjeksjon i .NET, kan du registrere at tjenesten din trenger en `ICorrespondenceClient`.
+Denne klienten kan deretter brukes til å sende meldinger og vil automatisk håndtere Maskinporten-autorisering.
+
+Når du skal sende en melding, finnes det veldig mange tilgjengelige parametere. Selv om bare et fåtall er nødvendige,
+kan selve prosessen med å bygge forespørselen være litt overveldende. For å hjelpe med dette, er det et `CorrespondenceRequestBuilder`-grensesnitt tilgjengelig.
+
+Eksempelet nedenfor bruker dette grensenittet til å bygge en meldingsforespørsel med de vanligste alternativene:
+selve meldingen, en varsling til mottakeren, og et vedlegg.
+
+Du finner alle tilgjengelige alternativer og tilhørende dokumentasjon via IntelliSense i din foretrukne kodeeditor.
+
+### Tjenesteregistrering
+
+{{< code-title >}}
+App/Program.cs
+{{< /code-title >}}
+
+{{}}
+// ...
+
+void RegisterCustomAppServices(
+ IServiceCollection services,
+ IConfiguration config,
+ IWebHostEnvironment env
+)
+{
+ services.AddTransient();
+}
+{{}}
+
+### Implementering av korrespondanseklient
+
+{{< code-title >}}
+App/CorrespondenceClientDemo.cs
+{{< /code-title >}}
+
+```cs
+using System;
+using System.Threading.Tasks;
+using Altinn.App.Core.Features.Correspondence;
+using Altinn.App.Core.Features.Correspondence.Builder;
+using Altinn.App.Core.Features.Correspondence.Models;
+
+namespace Altinn.App;
+
+internal sealed class CorrespondenceClientDemo(
+ ICorrespondenceClient correspondenceClient
+) : ITheInterfaceYouAreImplementing
+{
+ public async Task SendMessage()
+ {
+ CorrespondenceAuthorisation authorisation = CorrespondenceAuthorisation.Maskinporten;
+ CorrespondenceRequest request = CorrespondenceRequestBuilder
+ .Create()
+ .WithResourceId("A valid resource registry identifier")
+ .WithSender("Sender's organisation number")
+ .WithSendersReference("Sender's arbitrary reference for the correspondence")
+ .WithRecipient("Recipient's organisation number")
+ .WithAllowSystemDeleteAfter(DateTime.Now.AddYears(1))
+ .WithContent(
+ language: "en",
+ title: "Hello from .NET 👋🏻",
+ summary: "The message summary",
+ body: "The message body with markdown support"
+ )
+ .WithNotification(
+ CorrespondenceNotificationBuilder
+ .Create()
+ .WithNotificationTemplate(CorrespondenceNotificationTemplate.CustomMessage)
+ .WithEmailSubject("New Altinn message")
+ .WithEmailBody(
+ "You have a new message in your Altinn inbox, log in to see what's new."
+ )
+ .WithSmsBody("Got 📨 in Altinn")
+ .WithNotificationChannel(CorrespondenceNotificationChannel.EmailPreferred)
+ )
+ .WithAttachment(
+ CorrespondenceAttachmentBuilder
+ .Create()
+ .WithFilename("attachment.txt")
+ .WithName("The attachment 📎")
+ .WithSendersReference("Sender's arbitrary reference for the attachment")
+ .WithDataType("text/plain")
+ .WithData("This is the attachment content"u8.ToArray())
+ )
+ .Build();
+
+ return await correspondenceClient.Send(
+ new SendCorrespondencePayload(request, authorisation)
+ );
+ }
+
+ public async Task GetMessageStatus(Guid correspondenceId)
+ {
+ return await correspondenceClient.GetStatus(
+ new GetCorrespondenceStatusPayload(
+ correspondenceId,
+ CorrespondenceAuthorisation.Maskinporten
+ )
+ );
+ }
+}
+```
+
+### Notater om autorisering
+I eksempelet ovenfor bruker vi enum-verdien `CorrespondenceAuthorisation.Maskinporten` for å indikere at autorisering automatisk
+skal håndteres internt med Maskinporten. Dette er den enkleste og mest praktiske metoden for autorisasjon, men det er ikke den eneste tilgjengelige.
+
+Hvis du trenger tilpasset autoriseringslogikk i forbindelse med sending av meldinger, kan du bruke din egen delegat til dette formålet.
+
+Et eksempel på dette kan være hvis du av diverse årsaker foretrekker å bruke den [eksterne Maskinporten-klienten](https://github.com/Altinn/altinn-apiclient-maskinporten).
+
+Både `SendCorrespondencePayload` og `GetCorrespondenceStatusPayload` aksepterer et delegatparameter. Implementasjonen kan se slik ut:
+
+```cs
+// ...
+
+new SendCorrespondencePayload(
+ request,
+ async () =>
+ {
+ TokenResponse maskinportenResponse = await maskinportenService.GetToken(
+ "base64 encoded jwk",
+ "test|prod",
+ "the client id",
+ "altinn:serviceowner altinn:correspondence.write",
+ null
+ );
+
+ TokenResponse altinnResponse = await maskinportenService.ExchangeToAltinnToken(
+ maskinportenResponse,
+ "test|prod"
+ );
+
+ return JwtToken.Parse(altinnResponse.AccessToken);
+ }
+);
+```
\ No newline at end of file
diff --git a/content/altinn-studio/guides/integration/maskinporten-app-integration/_index.en.md b/content/altinn-studio/guides/integration/maskinporten/_index.en.md
similarity index 96%
rename from content/altinn-studio/guides/integration/maskinporten-app-integration/_index.en.md
rename to content/altinn-studio/guides/integration/maskinporten/_index.en.md
index 92240760827..f0eb54984dc 100644
--- a/content/altinn-studio/guides/integration/maskinporten-app-integration/_index.en.md
+++ b/content/altinn-studio/guides/integration/maskinporten/_index.en.md
@@ -1,13 +1,12 @@
---
-title: Integrate Altinn app with Maskinporten
-linktitle: Maskinporten-App integration
+title: Integrate an Altinn app with Maskinporten
+linktitle: Maskinporten
description: How to setup an integration between an Altinn App and Maskinporten.
weight: 100
toc: true
aliases:
-
- /app/maskinporten-app-integration/
-
+- /altinn-studio/guides/integration/maskinporten-app-integration
---
This guide details how to set up an Altinn application with a HTTP client that utilizes Maskinporten authentication for
@@ -74,6 +73,7 @@ When preparing the application to use secrets from Azure Key Vault, there are so
2. For the application to be able to read the secrets from Azure Key Vault, it needs to be configured to do so.
See the [secrets section](../../../reference/configuration/secrets) to achieve this.
3. Add the appsettings section example from above into the `appsettings.{env}.json` file.
+{.floating-bullet-numbers}
_Note: The secrets are read by the application on launch so
if you make changes after the application is deployed, you
diff --git a/content/altinn-studio/guides/integration/maskinporten-app-integration/_index.nb.md b/content/altinn-studio/guides/integration/maskinporten/_index.nb.md
similarity index 97%
rename from content/altinn-studio/guides/integration/maskinporten-app-integration/_index.nb.md
rename to content/altinn-studio/guides/integration/maskinporten/_index.nb.md
index 1935a983c24..71f728e1080 100644
--- a/content/altinn-studio/guides/integration/maskinporten-app-integration/_index.nb.md
+++ b/content/altinn-studio/guides/integration/maskinporten/_index.nb.md
@@ -1,13 +1,12 @@
---
title: Integrasjon av Altinn-app med Maskinporten
-linktitle: Maskinporten-App-integrasjon
+linktitle: Maskinporten
description: Hvordan sette opp en integrasjon mellom en Altinn-app og Maskinporten.
weight: 100
toc: true
aliases:
-
- /app/maskinporten-app-integration/
-
+- /altinn-studio/guides/integration/maskinporten-app-integration
---
Denne veiledningen viser hvordan du setter opp en Altinn-applikasjon med en HTTP-klient som benytter Maskinporten for
@@ -77,6 +76,7 @@ Når applikasjonen forberedes til å bruke hemmeligheter fra Azure Key Vault, m
2. For at applikasjonen skal kunne lese hemmelighetene fra Azure Key Vault, må konfigureres først.
Se [seksjoner om hemmeligheter](../../../reference/configuration/secrets) for hvordan dette oppnås.
3. Legg til appsettings-eksempelet ovenfor i `appsettings.{env}.json`-filen.
+{.floating-bullet-numbers}
_NB: Hemmelighetene leses av applikasjonen ved oppstart, så
hvis du endrer hemmelighetene etter at applikasjonen er publisert, må du
diff --git a/content/altinn-studio/guides/shared/api/altinn-token.md b/content/altinn-studio/guides/shared/api/altinn-token.md
index f2eec2d3d01..0977c51813e 100644
--- a/content/altinn-studio/guides/shared/api/altinn-token.md
+++ b/content/altinn-studio/guides/shared/api/altinn-token.md
@@ -10,7 +10,7 @@ in the _AltinnStudioRuntime_ cookie.
For clients within the Altinn eco-system representing an external user or organization,
the Altinn token in an incoming request can be forwarded to the {0} API.
-If you are using the API from an external system you will need to generate a Maskinporten or ID-porten token
+If you are using the API from an external system you will need to generate a Maskinporten or ID-Porten token
and exchange this for an Altinn token before calling the {0} API.
Below are two guides on how to achieve this.
@@ -29,7 +29,7 @@ We are working on providing you with a guide.
{{% /expandlarge %}}
-{{% expandlarge id="guide-altinn-token-id-porten" header="Guide on how to generate an Altinn token with id-porten" %}}
+{{% expandlarge id="guide-altinn-token-id-porten" header="Guide on how to generate an Altinn token with id-Porten" %}}
{{% notice info %}}
We are working on providing you with a guide.
diff --git a/content/altinn-studio/guides/shared/api/platform-access-token.md b/content/altinn-studio/guides/shared/api/platform-access-token.md
index 953091aadac..00f16816be0 100644
--- a/content/altinn-studio/guides/shared/api/platform-access-token.md
+++ b/content/altinn-studio/guides/shared/api/platform-access-token.md
@@ -3,7 +3,7 @@ headless: true
hidden: true
---
-The access to a subset of endpoints in the API is limited to callers within the Altinn eco-system.
+The access to a subset of endpoints in the API is limited to callers within the Altinn ecosystem.
These APIs require additional authorization in the form of a
Platform Access Token.
diff --git a/content/altinn-studio/reference/monitoring/registry/metrics/_index.en.md b/content/altinn-studio/reference/monitoring/registry/metrics/_index.en.md
index 4ba76d3b542..af9e7248789 100644
--- a/content/altinn-studio/reference/monitoring/registry/metrics/_index.en.md
+++ b/content/altinn-studio/reference/monitoring/registry/metrics/_index.en.md
@@ -10,18 +10,19 @@ This page refers to configuration when [OpenTelemetry (OTel)](https://openteleme
The existing Application Insights SDK setup is obsolete and will be removed in the next major version of the Altinn.App libraries.
{{% /notice %}}
-These metrics are built into Altinn.App libraries and are emitted automatically:
+The following metrics are built into Altinn.App libraries and are emitted automatically:
-| Metric Name | Type | Measures | Labels |
-| ------------------------------------ | --------- | --------------------------------------------------- | ------------------------------------------------------ |
-| `altinn_app_lib_data_patched` | Counter | Number of times a dataelements contents was patched | `result` = `success`, `error` |
-| `altinn_app_lib_instances_created` | Counter | Number of times an instance was created | |
-| `altinn_app_lib_instances_completed` | Counter | Number of times an instance was completed | |
-| `altinn_app_lib_instances_deleted` | Counter | Number of times an instance was deleted | |
-| `altinn_app_lib_instances_duration` | Histogram | Duration in seconds an instance was active | |
-| `altinn_app_lib_notification_orders` | Counter | Number of orders | `type` = `sms`, `email`; `result` = `success`, `error` |
-| `altinn_app_lib_processes_started` | Counter | Number of times a process was started | |
-| `altinn_app_lib_processes_ended` | Counter | Number of times a process was ended | |
-| `altinn_app_lib_processes_duration` | Histogram | Duration in seconds a process was active | |
+| Metric Name | Type | Measures | Labels |
+| -------------------------------------- | --------- | --------------------------------------------------------- | ------------------------------------------------------ |
+| `altinn_app_lib_data_patched` | Counter | Number of times the content of a data element was patched | `result` = `success`, `error` |
+| `altinn_app_lib_correspondence_orders` | Counter | Number of correspondence orders | `result` = `success`, `error` |
+| `altinn_app_lib_instances_created` | Counter | Number of times an instance was created | |
+| `altinn_app_lib_instances_completed` | Counter | Number of times an instance was completed | |
+| `altinn_app_lib_instances_deleted` | Counter | Number of times an instance was deleted | |
+| `altinn_app_lib_instances_duration` | Histogram | Duration in seconds an instance was active | |
+| `altinn_app_lib_notification_orders` | Counter | Number of notification orders | `type` = `sms`, `email`; `result` = `success`, `error` |
+| `altinn_app_lib_processes_started` | Counter | Number of times a process was started | |
+| `altinn_app_lib_processes_ended` | Counter | Number of times a process was ended | |
+| `altinn_app_lib_processes_duration` | Histogram | Duration in seconds a process was active | |
{{}}
diff --git a/content/altinn-studio/reference/monitoring/registry/metrics/_index.nb.md b/content/altinn-studio/reference/monitoring/registry/metrics/_index.nb.md
index e3cbdc3f05d..3cef465fad7 100644
--- a/content/altinn-studio/reference/monitoring/registry/metrics/_index.nb.md
+++ b/content/altinn-studio/reference/monitoring/registry/metrics/_index.nb.md
@@ -7,19 +7,22 @@ weight: 10
{{% notice info %}}
Denne siden refererer til konfigurasjon når [OpenTelemetry (OTel)](https://opentelemetry.io/) er i bruk i appen fra v8 og nyere.
-Det eksisterende Application Insights SDK oppsettet er utgått, og vil fjernes i neste hovedversjon av Altinn.App biblioteker
+Det eksisterende oppsettet for Application Insights SDK er utgått, og vil fjernes i neste hovedversjon av Altinn.App biblioteker.
{{% /notice %}}
-| Metrikknavn | Type | Måler | Labels |
-| ------------------------------------ | --------- | ----------------------------------------------------- | ------------------------------------------------------ |
-| `altinn_app_lib_data_patched` | Counter | Hvor mange ganger dataelemeters innhold ble oppdatert | `result` = `success`, `error` |
-| `altinn_app_lib_instances_created` | Counter | Hvor mange ganger en instanse ble opprettet | |
-| `altinn_app_lib_instances_completed` | Counter | Hvor mange ganger en insatnse ble fullført | |
-| `altinn_app_lib_instances_deleted` | Counter | Hvor mange ganger en instanse ble slettet | |
-| `altinn_app_lib_instances_duration` | Histogram | Varighet i sekunder for en instans | |
-| `altinn_app_lib_notification_orders` | Counter | Antall bestillinger | `type` = `sms`, `email`; `result` = `success`, `error` |
-| `altinn_app_lib_processes_started` | Counter | Hvor mange ganger en prosess ble startet | |
-| `altinn_app_lib_processes_ended` | Counter | Hvor mange ganger en prosess ble avsluttet | |
-| `altinn_app_lib_processes_duration` | Histogram | Varighet i sekunder for en prosess | |
+Følgende metrikker er innebygd i Altinn.App-bibliotekene og publiseres automatisk:
+
+| Metrikknavn | Type | Måler | Etiketter |
+| -------------------------------------- | --------- | ------------------------------------------------------------- | ------------------------------------------------------ |
+| `altinn_app_lib_data_patched` | Counter | Hvor mange ganger innholdet i et dataelement ble oppdatert | `result` = `success`, `error` |
+| `altinn_app_lib_correspondence_orders` | Counter | Number of meldingsbestillinger | `result` = `success`, `error` |
+| `altinn_app_lib_instances_created` | Counter | Hvor mange ganger en instanse ble opprettet | |
+| `altinn_app_lib_instances_completed` | Counter | Hvor mange ganger en insatnse ble fullført | |
+| `altinn_app_lib_instances_deleted` | Counter | Hvor mange ganger en instanse ble slettet | |
+| `altinn_app_lib_instances_duration` | Histogram | Varighet i sekunder for en instanse | |
+| `altinn_app_lib_notification_orders` | Counter | Antall varslingsbestillinger | `type` = `sms`, `email`; `result` = `success`, `error` |
+| `altinn_app_lib_processes_started` | Counter | Hvor mange ganger en prosess ble startet | |
+| `altinn_app_lib_processes_ended` | Counter | Hvor mange ganger en prosess ble avsluttet | |
+| `altinn_app_lib_processes_duration` | Histogram | Varighet i sekunder for en prosess | |
{{}}
diff --git a/static/css/custom.css b/static/css/custom.css
index 6d6d193fd3d..eb8099adbfc 100644
--- a/static/css/custom.css
+++ b/static/css/custom.css
@@ -587,4 +587,25 @@ input[type="search"] {
.product-item {
font-weight: bold;
font-size: 2rem !important;
- }
\ No newline at end of file
+ }
+
+/* Ordered list fix for list items containing block elements */
+.floating-bullet-numbers li::before {
+float: left;
+}
+
+/* Customisations for integration/correspondence */
+.correspondence-custom-list {
+ margin-bottom: 18px !important;
+ padding-left: 8px;
+}
+.correspondence-custom-list li {
+margin-left: 0 !important;
+margin-bottom: 0 !important;
+}
+#notice-paragraph-fix p {
+ margin-bottom: inherit;
+}
+#notice-paragraph-fix p:last-child {
+ margin-bottom: 0;
+}
\ No newline at end of file
diff --git a/themes/hugo-theme-altinn/static/js/altinndocs-learn.js b/themes/hugo-theme-altinn/static/js/altinndocs-learn.js
index 9ff9397efe3..037011638da 100644
--- a/themes/hugo-theme-altinn/static/js/altinndocs-learn.js
+++ b/themes/hugo-theme-altinn/static/js/altinndocs-learn.js
@@ -165,7 +165,7 @@ jQuery(document).ready(function() {
// clipboard
var clipInit = false;
- $('code').each(function() {
+ $('pre code').each(function() {
var code = $(this),
text = code.text();