diff --git a/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonGCPKlient.java b/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonGCPKlient.java
index 83adc305a..5af890cf4 100644
--- a/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonGCPKlient.java
+++ b/integrasjon/arbeidsfordeling-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjerming/AbstractSkjermetPersonGCPKlient.java
@@ -15,7 +15,7 @@
import no.nav.vedtak.felles.integrasjon.rest.RestRequest;
// Extend og annoter med endpoint+default og scopes/default + tokenConfig = AzureAD_CC
-//@RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, endpointProperty = "skjermet.person.rs.url", endpointDefault = "https://skjermede-personer-pip.intern.nav.no/skjermet",
+//@RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, endpointProperty = "skjermet.person.rs.url", endpointDefault = "https://skjermede-personer-pip.intern.nav.no",
// scopesProperty = "skjermet.person.rs.azure.scope", scopesDefault = "api://prod-gcp.nom.skjermede-personer-pip/.default")
public abstract class AbstractSkjermetPersonGCPKlient implements Skjerming {
diff --git a/integrasjon/pip-klient/README.md b/integrasjon/pip-klient/README.md
new file mode 100644
index 000000000..637d750bd
--- /dev/null
+++ b/integrasjon/pip-klient/README.md
@@ -0,0 +1,13 @@
+# pip-klient
+
+Samling av pip-klienter som brukes til å henter informasjon for tilgangskontroll og ruting av saker
+
+## Hensikten
+
+Tilby data til applikasjoner som implementerer tilgangskontrollvurderinger
+
+## Integrasjoner
+
+* PDL-PIP-API
+* SKJERMET PERSON
+* Muligens FP-sak
diff --git a/integrasjon/pip-klient/pom.xml b/integrasjon/pip-klient/pom.xml
new file mode 100644
index 000000000..950b35334
--- /dev/null
+++ b/integrasjon/pip-klient/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ no.nav.foreldrepenger.felles.integrasjon
+ felles-integrasjon-pom
+ 0.0.0-SNAPSHOT
+
+ pip-klient
+ jar
+ Felles :: Integrasjonsendepunkt - pip-klient
+
+
+
+ no.nav.foreldrepenger.felles.integrasjon
+ felles-integrasjon-rest-klient
+
+
+ jakarta.validation
+ jakarta.validation-api
+
+
+
diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/AbstractForeldrepengerPipKlient.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/AbstractForeldrepengerPipKlient.java
new file mode 100644
index 000000000..2278762ce
--- /dev/null
+++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/AbstractForeldrepengerPipKlient.java
@@ -0,0 +1,69 @@
+package no.nav.vedtak.felles.integrasjon.fpsakpip;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Objects;
+
+import jakarta.validation.constraints.NotNull;
+import jakarta.ws.rs.core.UriBuilder;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import no.nav.vedtak.felles.integrasjon.rest.RestClient;
+import no.nav.vedtak.felles.integrasjon.rest.RestConfig;
+import no.nav.vedtak.felles.integrasjon.rest.RestRequest;
+
+/*
+ * Informasjon fra skjermingsløsningen til bruk for tilgangskontroll. Registrer klientapps hos nom
+ */
+
+// Extend og annoter med @RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, application = FpApplication.FPSAK)
+public abstract class AbstractForeldrepengerPipKlient implements ForeldrepengerPip {
+
+ private static final Logger LOG = LoggerFactory.getLogger(AbstractForeldrepengerPipKlient.class);
+
+ private static final String SAK_AKTØR_PATH = "/api/pip/aktoer-for-sak";
+
+ private final RestClient restClient;
+ private final RestConfig restConfig;
+
+ private final URI sakAktørerEndpoint;
+
+ protected AbstractForeldrepengerPipKlient() {
+ this(RestClient.client());
+ }
+
+ protected AbstractForeldrepengerPipKlient(RestClient restClient) {
+ this.restClient = restClient;
+ this.restConfig = RestConfig.forClient(this.getClass());
+ this.sakAktørerEndpoint = UriBuilder.fromUri(restConfig.fpContextPath()).path(SAK_AKTØR_PATH).build();
+ if (!restConfig.tokenConfig().isAzureAD()) {
+ throw new IllegalArgumentException("Utviklerfeil: klient må annoteres med Azure CC");
+ }
+ }
+
+
+ @Override
+ public List personerForSak(String saksnummer) {
+ if (saksnummer == null) {
+ return List.of();
+ }
+
+ var request = RestRequest.newPOSTJson(new SaksnummerDto(saksnummer), sakAktørerEndpoint, restConfig);
+
+ try {
+ return restClient.sendReturnList(request, ForeldrepengerPipAktørId.class);
+ } catch (Exception e) {
+ LOG.info("ForeldrepengerPip fikk feil", e);
+ }
+ return restClient.sendReturnList(request, ForeldrepengerPipAktørId.class);
+ }
+
+ public record SaksnummerDto(@NotNull String saksnummer) {
+ public SaksnummerDto {
+ Objects.requireNonNull(saksnummer, "saksnummer");
+ }
+ }
+
+}
diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPip.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPip.java
new file mode 100644
index 000000000..d230cb5ab
--- /dev/null
+++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPip.java
@@ -0,0 +1,9 @@
+package no.nav.vedtak.felles.integrasjon.fpsakpip;
+
+import java.util.List;
+
+public interface ForeldrepengerPip {
+
+ List personerForSak(String fnr);
+
+}
diff --git "a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPipAkt\303\270rId.java" "b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPipAkt\303\270rId.java"
new file mode 100644
index 000000000..6d3286dc8
--- /dev/null
+++ "b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/fpsakpip/ForeldrepengerPipAkt\303\270rId.java"
@@ -0,0 +1,68 @@
+package no.nav.vedtak.felles.integrasjon.fpsakpip;
+
+import java.io.Serializable;
+import java.util.Objects;
+import java.util.regex.Pattern;
+
+import jakarta.validation.constraints.NotNull;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Id som genereres fra NAV Aktørregister.
+ * Denne iden benyttes til interne forhold i Nav og vil ikke endres f.eks. dersom bruker går fra DNR til FNR i Folkeregisteret.
+ */
+public class ForeldrepengerPipAktørId implements Serializable, Comparable {
+ private static final String VALID_REGEXP = "^\\d{13}$";
+
+ private static final Pattern VALID = Pattern.compile(VALID_REGEXP, Pattern.CASE_INSENSITIVE);
+
+ @JsonValue
+ @NotNull
+ @jakarta.validation.constraints.Pattern(regexp = VALID_REGEXP, message = "aktørId ${validatedValue} har ikke gyldig verdi (pattern '{regexp}')")
+ private String aktørId;
+
+ public ForeldrepengerPipAktørId(Long aktørId) {
+ Objects.requireNonNull(aktørId, "aktørId");
+ this.aktørId = validateAktørId(aktørId.toString());
+ }
+
+ public ForeldrepengerPipAktørId(String aktørId) {
+ this.aktørId = validateAktørId(aktørId);
+ }
+
+ private String validateAktørId(String aktørId) {
+ Objects.requireNonNull(aktørId, "aktørId");
+ if (!VALID.matcher(aktørId).matches()) {
+ // skal ikke skje, funksjonelle feilmeldinger håndteres ikke her.
+ throw new IllegalArgumentException("Ugyldig aktørId '" + aktørId + "', tillatt pattern: " + VALID_REGEXP);
+ }
+ return aktørId;
+ }
+
+ public String getVerdi() {
+ return aktørId;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof ForeldrepengerPipAktørId annen && Objects.equals(aktørId, annen.aktørId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(aktørId);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "";
+ }
+
+ @Override
+ public int compareTo(ForeldrepengerPipAktørId o) {
+ // TODO: Burde ikke finnes
+ return aktørId.compareTo(o.aktørId);
+ }
+
+}
diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/AbstractPersondataPipKlient.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/AbstractPersondataPipKlient.java
new file mode 100644
index 000000000..6aefd3383
--- /dev/null
+++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/AbstractPersondataPipKlient.java
@@ -0,0 +1,79 @@
+package no.nav.vedtak.felles.integrasjon.pdlpip;
+
+import java.net.URI;
+import java.time.Duration;
+import java.util.List;
+import java.util.Map;
+
+import jakarta.ws.rs.core.UriBuilder;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import no.nav.vedtak.felles.integrasjon.rest.RestClient;
+import no.nav.vedtak.felles.integrasjon.rest.RestConfig;
+import no.nav.vedtak.felles.integrasjon.rest.RestRequest;
+
+/*
+ * Informasjon fra PDL til bruk kun for tilgangskontroll. Registrer klientapps hos pdl
+ *
+ * PROD: SD innenfor FSS ellers https pdl-pip-api.intern.nav.no (scope: prod-fss:pdl:pdl-pip-api)
+ * DEV: SD innenfor FSS ellers https pdl-pip-api.dev.intern.nav.no (scope: dev-fss:pdl:pdl-pip-api)
+ */
+
+// Extend og annoter med endpoint+default og scopes/default + tokenConfig = AzureAD_CC
+//@RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, endpointProperty = "pdl.pip.base.url",
+// endpointDefault = "http://pdl-pip-api.pdl/api/v1", // For FSS - apps i GCP bruker https://pdl-pip-api.intern.nav.no/api/v1
+// scopesProperty = "pdl.pip.scope", scopesDefault = "api://prod-fss:pdl:pdl-pip-api/.default")
+public abstract class AbstractPersondataPipKlient implements PersondataPip {
+
+ private static final Logger LOG = LoggerFactory.getLogger(AbstractPersondataPipKlient.class);
+ private static final String PERSON_PATH = "person";
+ private static final String PERSON_BOLK_PATH = "personBolk";
+
+ private final RestClient client;
+ private final RestConfig restConfig;
+ private final URI pipPersonBolkEndpoint;
+ private final URI pipPersonEndpoint;
+
+
+ protected AbstractPersondataPipKlient() {
+ this(RestClient.client());
+ }
+
+ protected AbstractPersondataPipKlient(RestClient restClient) {
+ this.client = restClient;
+ this.restConfig = RestConfig.forClient(this.getClass());
+ this.pipPersonEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(PERSON_PATH).build();
+ this.pipPersonBolkEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(PERSON_BOLK_PATH).build();
+ if (!restConfig.tokenConfig().isAzureAD()) {
+ throw new IllegalArgumentException("Utviklerfeil: klient må annoteres med Azure CC");
+ }
+ }
+
+ @Override
+ public PersondataPipDto hentTilgangPersondata(String ident) {
+ var request = RestRequest.newGET(pipPersonEndpoint, restConfig)
+ .header("ident", ident)
+ .timeout(Duration.ofSeconds(5));
+ try {
+ return client.send(request, PersondataPipDto.class);
+ } catch (Exception e) {
+ LOG.info("PdlPip fikk feil", e);
+ }
+ return client.send(request, PersondataPipDto.class);
+ }
+
+ @Override
+ public Map hentTilgangPersondataBolk(List identer) {
+ var request = RestRequest.newPOSTJson(identer, pipPersonBolkEndpoint, restConfig)
+ .timeout(Duration.ofSeconds(5));
+ try {
+ return client.sendReturnMap(request, PersondataPipDto.class);
+ } catch (Exception e) {
+ LOG.info("PdlPip fikk feil", e);
+ }
+ return client.sendReturnMap(request, PersondataPipDto.class);
+ }
+
+}
diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPip.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPip.java
new file mode 100644
index 000000000..a4f0d3810
--- /dev/null
+++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPip.java
@@ -0,0 +1,12 @@
+package no.nav.vedtak.felles.integrasjon.pdlpip;
+
+import java.util.List;
+import java.util.Map;
+
+public interface PersondataPip {
+
+ PersondataPipDto hentTilgangPersondata(String ident);
+
+ Map hentTilgangPersondataBolk(List identer);
+
+}
diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipDto.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipDto.java
new file mode 100644
index 000000000..284c1a0bb
--- /dev/null
+++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipDto.java
@@ -0,0 +1,97 @@
+package no.nav.vedtak.felles.integrasjon.pdlpip;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Optional;
+
+import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
+
+public record PersondataPipDto(String aktoerId, Person person, Identer identer, GeografiskTilknytning geografiskTilknytning) {
+
+ public record Person(List adressebeskyttelse, List foedsel,
+ List doedsfall, List familierelasjoner) {
+ }
+
+ public record Adressebeskyttelse(Gradering gradering) { }
+
+ public record Fødsel(LocalDate foedselsdato) { }
+
+ public record Dødsfall(LocalDate doedsdato) { }
+
+ public record Familierelasjon(String relatertPersonsIdent) { } // en personIdent (FNR/DNR)
+
+ public record Identer(List identer) { }
+
+ public record Ident(String ident, Boolean historisk, IdentGruppe gruppe) { }
+
+ public record GeografiskTilknytning(GtType gtType, String gtKommune, String gtBydel, String gtLand, String regel) { }
+
+ public enum Gradering { STRENGT_FORTROLIG_UTLAND, STRENGT_FORTROLIG, FORTROLIG, @JsonEnumDefaultValue UDEFINERT }
+
+ public enum IdentGruppe { AKTORID, FOLKEREGISTERIDENT, NPID, @JsonEnumDefaultValue UDEFINERT }
+
+ public enum GtType { KOMMUNE, BYDEL, UTLAND, @JsonEnumDefaultValue UDEFINERT }
+
+ public enum Relasjonsrolle { FAR, MOR, MEDMOR, BARN, @JsonEnumDefaultValue UDEFINERT }
+
+ public boolean harStrengAdresseBeskyttelse() {
+ return Optional.ofNullable(person()).map(Person::adressebeskyttelse).orElse(List.of()).stream()
+ .map(Adressebeskyttelse::gradering)
+ .anyMatch(g -> Gradering.STRENGT_FORTROLIG.equals(g) || Gradering.STRENGT_FORTROLIG_UTLAND.equals(g));
+ }
+
+ public boolean harAdresseBeskyttelse() {
+ return Optional.ofNullable(person()).map(Person::adressebeskyttelse).orElse(List.of()).stream()
+ .map(Adressebeskyttelse::gradering)
+ .anyMatch(g -> g != null && !Gradering.UDEFINERT.equals(g));
+ }
+
+ public boolean erIkkeMyndig() {
+ return Optional.ofNullable(person()).map(Person::foedsel).orElse(List.of()).stream()
+ .map(Fødsel::foedselsdato)
+ .anyMatch(f -> f == null || f.plusYears(18).isAfter(LocalDate.now()));
+ }
+
+ public String personIdent() {
+ return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream()
+ .filter(i -> IdentGruppe.FOLKEREGISTERIDENT.equals(i.gruppe()))
+ .filter(i -> !i.historisk())
+ .map(Ident::ident)
+ .findFirst().orElse(null);
+ }
+
+ public List personIdenter() {
+ return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream()
+ .filter(i -> IdentGruppe.FOLKEREGISTERIDENT.equals(i.gruppe()))
+ .map(Ident::ident)
+ .toList();
+ }
+
+ public String aktørId() {
+ return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream()
+ .filter(i -> IdentGruppe.AKTORID.equals(i.gruppe()))
+ .filter(i -> !i.historisk())
+ .map(Ident::ident)
+ .findFirst().orElse(null);
+ }
+
+ public List aktørIdMedHistoriske() {
+ return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream()
+ .filter(i -> IdentGruppe.AKTORID.equals(i.gruppe()))
+ .map(Ident::ident)
+ .toList();
+ }
+
+ public boolean harNasjonalTilknytning() {
+ return Optional.ofNullable(geografiskTilknytning()).map(GeografiskTilknytning::gtType)
+ .filter(gtt -> GtType.KOMMUNE.equals(gtt) || GtType.BYDEL.equals(gtt))
+ .isPresent();
+ }
+
+ public boolean harIkkeNasjonalTilknytning() {
+ return Optional.ofNullable(geografiskTilknytning()).map(GeografiskTilknytning::gtType)
+ .filter(gtt -> GtType.KOMMUNE.equals(gtt) || GtType.BYDEL.equals(gtt))
+ .isEmpty();
+ }
+
+}
diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/AbstractSkjermetPersonPipKlient.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/AbstractSkjermetPersonPipKlient.java
new file mode 100644
index 000000000..6cd40b314
--- /dev/null
+++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/AbstractSkjermetPersonPipKlient.java
@@ -0,0 +1,99 @@
+package no.nav.vedtak.felles.integrasjon.skjermingpip;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import jakarta.ws.rs.core.UriBuilder;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import no.nav.vedtak.felles.integrasjon.rest.RestClient;
+import no.nav.vedtak.felles.integrasjon.rest.RestConfig;
+import no.nav.vedtak.felles.integrasjon.rest.RestRequest;
+
+/*
+ * Informasjon fra skjermingsløsningen til bruk for tilgangskontroll. Registrer klientapps hos nom
+ */
+
+// Extend og annoter med endpoint+default og scopes/default + tokenConfig = AzureAD_CC
+//@RestClientConfig(tokenConfig = TokenFlow.AZUREAD_CC, endpointProperty = "skjermet.person.pip.base.url",
+// endpointDefault = "https://skjermede-personer-pip.intern.nav.no", // For FSS - apps i GCP bruker http://skjermede-personer-pip.nom
+// scopesProperty = "skjermet.person.pip.scope", scopesDefault = "api://prod-gcp.nom.skjermede-personer-pip/.default")
+public abstract class AbstractSkjermetPersonPipKlient implements SkjermetPersonPip {
+
+ private static final Logger LOG = LoggerFactory.getLogger(AbstractSkjermetPersonPipKlient.class);
+
+ private static final String SKJERMET_PATH = "skjermet";
+ private static final String BULK_PATH = "skjermetBulk";
+
+ private final RestClient client;
+ private final RestConfig restConfig;
+ private final URI bulkEndpoint;
+ private final URI skjermetEndpoint;
+
+ protected AbstractSkjermetPersonPipKlient() {
+ this(RestClient.client());
+ }
+
+ protected AbstractSkjermetPersonPipKlient(RestClient restClient) {
+ this.client = restClient;
+ this.restConfig = RestConfig.forClient(this.getClass());
+ this.skjermetEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(SKJERMET_PATH).build();
+ this.bulkEndpoint = UriBuilder.fromUri(restConfig.endpoint()).path(BULK_PATH).build();
+ if (!restConfig.tokenConfig().isAzureAD()) {
+ throw new IllegalArgumentException("Utviklerfeil: klient må annoteres med Azure CC");
+ }
+ }
+
+
+ @Override
+ public boolean erSkjermet(String fnr) {
+ if (fnr == null) {
+ return false;
+ }
+
+ var request = RestRequest.newPOSTJson(new SkjermetRequestDto(fnr), skjermetEndpoint, restConfig);
+
+ try {
+ return kallMedSjekk(request);
+ } catch (Exception e) {
+ LOG.info("SkjermetPerson fikk feil", e);
+ }
+ return kallMedSjekk(request);
+ }
+
+ private boolean kallMedSjekk(RestRequest request) {
+ var skjermet = client.send(request, String.class);
+ return "true".equalsIgnoreCase(skjermet);
+ }
+
+ @Override
+ public boolean erNoenSkjermet(List fnr) {
+ if (fnr == null || fnr.isEmpty()) {
+ return false;
+ }
+
+ var request = RestRequest.newPOSTJson(new SkjermetBulkRequestDto(fnr), bulkEndpoint, restConfig);
+
+ try {
+ return kallBulkMedSjekk(request);
+ } catch (Exception e) {
+ LOG.info("SkjermetPerson fikk feil", e);
+ }
+ return kallBulkMedSjekk(request);
+ }
+
+ @SuppressWarnings("unchecked")
+ private boolean kallBulkMedSjekk(RestRequest request) {
+ // Se github / skjerming / PipController
+ Map skjermet = client.send(request, Map.class);
+ return skjermet.values().stream().anyMatch(v -> v);
+ }
+
+ private record SkjermetRequestDto(String personident) { }
+
+ private record SkjermetBulkRequestDto(List personidenter) { }
+
+}
diff --git a/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/SkjermetPersonPip.java b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/SkjermetPersonPip.java
new file mode 100644
index 000000000..b19455d95
--- /dev/null
+++ b/integrasjon/pip-klient/src/main/java/no/nav/vedtak/felles/integrasjon/skjermingpip/SkjermetPersonPip.java
@@ -0,0 +1,11 @@
+package no.nav.vedtak.felles.integrasjon.skjermingpip;
+
+import java.util.List;
+
+public interface SkjermetPersonPip {
+
+ boolean erSkjermet(String fnr);
+
+ boolean erNoenSkjermet(List fnr);
+
+}
diff --git a/integrasjon/pip-klient/src/test/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipTest.java b/integrasjon/pip-klient/src/test/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipTest.java
new file mode 100644
index 000000000..a96c0bfc1
--- /dev/null
+++ b/integrasjon/pip-klient/src/test/java/no/nav/vedtak/felles/integrasjon/pdlpip/PersondataPipTest.java
@@ -0,0 +1,151 @@
+package no.nav.vedtak.felles.integrasjon.pdlpip;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+import no.nav.vedtak.mapper.json.DefaultJsonMapper;
+
+
+
+public class PersondataPipTest {
+
+ private static final String PERSON_RESPONS = """
+ {
+ "person": {
+ "adressebeskyttelse": [
+ {
+ "gradering": "STRENGT_FORTROLIG_UTLAND"
+ }
+ ],
+ "foedsel": [
+ {
+ "foedselsdato": "1911-01-01"
+ }
+ ],
+ "doedsfall": [
+ {
+ "doedsdato": "1977-07-07"
+ }
+ ],
+ "familierelasjoner": [
+ {
+ "relatertPersonsIdent": "11223344550"
+ }
+ ]
+ },
+ "identer": {
+ "identer": [
+ {
+ "ident": "1234567890123",
+ "historisk": false,
+ "gruppe": "AKTORID"
+ },
+ {
+ "ident": "9876543210987",
+ "historisk": true,
+ "gruppe": "AKTORID"
+ },
+ {
+ "ident": "12345678901",
+ "historisk": false,
+ "gruppe": "FOLKEREGISTERIDENT"
+ },
+ {
+ "ident": "98765432109",
+ "historisk": true,
+ "gruppe": "FOLKEREGISTERIDENT"
+ }
+ ]
+ },
+ "geografiskTilknytning": {
+ "gtType": null,
+ "gtKommune": "kommune",
+ "gtBydel": "bydel",
+ "gtLand": "sørlandet",
+ "regel": "42"
+ }
+ }
+ """;
+
+ private static final String PERSON_BOLK_RESPONS = """
+ {
+ "12345678901": {
+ "person": {
+ "adressebeskyttelse": [],
+ "foedsel": [
+ {
+ "foedselsdato": "1998-05-09"
+ }
+ ],
+ "doedsfall": [
+ ],
+ "familierelasjoner": [
+ {
+ "relatertPersonsIdent": "23456789012"
+ },
+ {
+ "relatertPersonsIdent": "34567890123"
+ }
+ ]
+ },
+ "identer": {
+ "identer": [
+ {
+ "ident": "2052090676205",
+ "historisk": false,
+ "gruppe": "AKTORID"
+ },
+ {
+ "ident": "12345678901",
+ "historisk": false,
+ "gruppe": "FOLKEREGISTERIDENT"
+ }
+ ]
+ },
+ "geografiskTilknytning": {
+ "gtType": "KOMMUNE",
+ "gtKommune": "4644",
+ "gtBydel": null,
+ "gtLand": null,
+ "regel": "18"
+ }
+ },
+ "10111111111": null
+ }
+ """;
+
+ @Test
+ void test_response() {
+ var deserialized = DefaultJsonMapper.fromJson(PERSON_RESPONS, PersondataPipDto.class);
+ assertThat(deserialized).isNotNull();
+ assertThat(deserialized.harStrengAdresseBeskyttelse()).isTrue();
+ assertThat(deserialized.harAdresseBeskyttelse()).isTrue();
+ assertThat(deserialized.harIkkeNasjonalTilknytning()).isTrue();
+ assertThat(deserialized.harNasjonalTilknytning()).isFalse();
+ assertThat(deserialized.erIkkeMyndig()).isFalse();
+ assertThat(deserialized.aktørIdMedHistoriske()).hasSize(2);
+ assertThat(deserialized.aktørId()).isEqualTo("1234567890123");
+ assertThat(deserialized.personIdent()).isEqualTo("12345678901");
+ }
+
+ @Test
+ void test_response_bolk() {
+ var deserialized = DefaultJsonMapper.mapFromJson(PERSON_BOLK_RESPONS, PersondataPipDto.class);
+ assertThat(deserialized).isNotNull();
+ assertThat(deserialized).isNotEmpty();
+ assertThat(deserialized.keySet()).hasSize(2);
+ assertThat(deserialized.values()).hasSize(2);
+ assertThat(deserialized.get("10111111111")).isNull();;
+ var element = deserialized.get("12345678901");
+ assertThat(element.harStrengAdresseBeskyttelse()).isFalse();
+ assertThat(element.harAdresseBeskyttelse()).isFalse();
+ assertThat(element.harNasjonalTilknytning()).isTrue();
+ assertThat(element.harIkkeNasjonalTilknytning()).isFalse();
+ assertThat(element.erIkkeMyndig()).isFalse();
+ assertThat(element.aktørIdMedHistoriske()).hasSize(1);
+ assertThat(element.aktørId()).isEqualTo("2052090676205");
+ assertThat(element.personIdent()).isEqualTo("12345678901");
+ }
+
+}
diff --git a/integrasjon/pom.xml b/integrasjon/pom.xml
index c6681f183..08a8d6671 100644
--- a/integrasjon/pom.xml
+++ b/integrasjon/pom.xml
@@ -20,6 +20,7 @@
infotrygd-grunnlag-klient
dokarkiv-klient
person-klient
+ pip-klient
oppgave-rest-klient
ereg-klient
saf-klient