Vejledning

Sådan opsættes et API til Member Import

For at integrere til GoPublic Member Import API, og på den måde kunne uploade og vedligeholde kontaktoplysninger på jeres medarbejdere, skal I som kunde sikre, at jeres data og systemkonfiguration stemmer overens med følgende krav.

Du kan finde en FAQ, med de spørgsmål vi indtil nu er blevet stillet, nederst på siden.

Endpoint access og request med API-nøgle

Vores API endpoint kan tilgås her: https://gapi.admin.dit-domænenavn.dk/backend/member/import-by-api-key

For at kalde vores Member Import API, skal I bruge en API-nøgle. Denne vil I få fremsendt på mail.

Et request i headeren i fx. Postman vil derfor se sådan ud:

KeyValue
x-api-keyDen fremsendte API-nøgle

Påkrævede felter

uuids

Feltet uuids fungerer som en slags primærnøgle i forbindelse med import. Det er påkrævet og bruges til at afgøre, om et “member” (kontaktperson) allerede eksisterer.
Hvis et eksisterende medlem har samme UUID, opdateres det med nye oplysninger. Ellers oprettes et nyt “member”. Det er muligt at tilknytte flere UUIDS til hver “member”.

name, email, fullName og roles

Felterne name, email, fullName og roles er påkrævede ved oprettelse af et nyt “Member”, og skal derfor være inkluderet ved første import.

Member rollerne skal være oprettet i backoffice inden I importerer jeres members, da importen ellers vil fejle.

Sletning og Lock-flag

Vi benytter en flag-baseret tilgang til sletning af “members”:

Såfremt et medlem ønskes slettet, sættes feltet lockForDeletion således: "lockForDeletion: "true",

Medlemmet vil da blive låst og vil automatisk blive slettet efter 30 dage.

Påkrævet dataformat

Data skal sendes i følgende struktur:

{

  "members": [

    {

      "uuids": ["string","string"],

      "name": "string",

      "email": "string",

      "firstName": "string",

      "surname": "string",

      "fullName": "string",

      "memberId": "integer",

      "location": "string",

      "dateOfBirth": "2025-12-02T10:31:53.926Z",

      "startDate": "2025-12-02T10:31:53.926Z",

      "title": "string",

      "headOfDepartment": "boolean",

      "department": "string",

      "phoneNumber": "string",

      "mobileNumber": "string",

      "secondaryEmail": "string",

      "workDescription": "string",

      "language": "string",

      "avatar": "string",

      "facebookLink": "string",

      "linkedInLink": "string",

      "instagramLink": "string",

      "xLink": "string",

      "additionalLink": "string",

      "roles": ["loginOnly","MemberRole2"],

      "categories": ["Foreninger/Personaleforening", "Foreninger/Løbeklub"], 

      "organizations": ["Org/department/office/3"],

      "lockForDeletion": "boolean",

    }

  ]

}

Strukturkrav og feltforklaring

Felterne uuids, roles, categories og organizations skal angives som arrays, da hver medarbejder evt. har flere af disse tilknyttet.

categories og organizations skal opbygges med en hierarkisk struktur, skilt med “/”, f.eks. "Org/department/office/3".

Eksempler

Hver “value” er en “string” med hele stien. Alle niveauer i stien tildeles medlemmet automatisk.

"uuids": ["f56ac10b-55cc-4372-a567-0e02a3c3d859","f86ac12c-45cc-4372-a567-0e09b3c7d359"],

roles er et krævet datafelt ved første import af et member.

Det skal primært benyttes, hvis man vil give Member-rettigheder i back-end eller front-end. 

Såfremt importen udelukkende skal benyttes til en telefonbog på sitet, skal der stadig tilknyttes en rolle. Her kan en af følgende roller f.eks. benyttes:

  • Telefonbog
  • Medarbejderoversigt

Rollerne i import-filen skal altid matche rollerne i backoffice.

"roles": ["loginOnly","MemberRole2","MemberRole3"],

"categories": ["Kurser/It-sikkerhed", "Kurser/HR-intro"],

"organizations": ["Departement/Styrelse/Afdeling1/Kontor1"], 

eller

"organizations": ["Departement/Styrelse/Afdeling3"],

Feltforklaring

Felterne name og fullName er begge påkrævet - dog kun ved oprettelse af et nyt medlem. 

Forskellen på de to felter er, at name er det navn, der vil komme til at stå ude i træstrukturen, hvor fullName er det navn, der vil stå på medlemmet i frontend.

Feltet headOfDepartment er af typen "boolean" og kan udfyldes med enten "true" eller "false".

Feltet lockForDeletion er af typen "boolean" og kan udfyldes med enten "true" eller "false".

Sættes værdien til "true", vil medlemmet blive låst og automatisk blive slettet efter 30 dage.

Datavalidering

Hvis de afsendte data ikke matcher det forventede format, vil API’et returnere en valideringsfejl med information om, hvilke felter der mangler eller er ugyldige.

Frekvens for kald

I vælger selv, hvor ofte der skal foretages kald til endpointet. Hyppigheden for opdatering håndteres på jeres side som del af den service, I har udviklet. 

I GoPublic Member API har vi lavet logik, som sikrer, at kun members med nye oplysninger importeres.

Eksempel på datamapping

Typisk feltnavn hos kundenFeltnavn i GoPublic APIEksempelPåkrævet
UUIDuuids"uuids": ["f56ac10b-55cc-4372-a567-0e02a3c3d859"],X
Navnname"name": "Jens Hansen",X
E-mailemail"email": "jens@testmail.dk",X
FornavnfirstName"firstName": "Jens",
Efternavnsurname"surname": "Hansen",
Fulde navnfullName"fullName": "Jens Søren Hansen",X
Medlems IDmemberId"memberId": "6"
Lokationlocation"location": "København",
FødselsdatodateOfBirth"dateOfBirth": "1974-03-25T10:31:53.926Z",
Start datostartDate"startDate": "2021-03-01T10:31:53.926Z",
Titeltitle"title": "IT-supporter",
AfdelingslederheadOfDepartment"headOfDepartment": "false",
Afdelingdepartment"department": "Support og Service",
TelefonphoneNumber"phoneNumber": "12345678",
MobilmobileNumber"mobileNumber": "87654321",
Alternativ e-mailsecondaryEmail"secondaryEmail": "info@testmail.dk",
ArbejdsbeskrivelseworkDescription"workDescription": "Ansvarlig for IT-supporten af kunderne",
Sproglanguage"language": "Dansk",
Billedeavatar"avatar": "data:image/jpeg;base64,/9j/4AAQ-SkZJRgABAQAAAQABAAD...",
Facebook linkfacebookLink"facebookLink": "https://www.facebook.com/dit.navn",
LinkedIn linklinkedInLink"linkedInLink": "https://www.linkedin.com/in/dit-navn-a3aa1365/",
Instagram linkinstagramLink"instagramLink": "https://www.instagram.com/bruger-navn/",
X linkxLink"xLink": "https://x.com/brugernavn",
Yderligere linkadditionalLink"additionalLink": "https://www.gopublic.dk",
Rollerroles"roles": ["Administrator"],X
Kategoriercategories"categories": ["Kurser/It-sikkerhed", "Kurser/HR-intro"]
Organisationorganizations"organizations": ["GoPublic/Support og Service"],
(Sletning af medlem)lockForDeletion"lockForDeletion": "false",

Eksempel på Python script

Vi har opsat dette script for at vise, hvordan et fuldt funktionelt Python script kan se ud.

import csv
import requests

 

API_ENDPOINT = 'https://gapi.admin.domænenavn.dk/backend/member/import-by-api-key'
API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ORIGIN = 'https://domænenavn.dk'
CSV_FILE = "Kontakter.csv"

 

members = []
with open(CSV_FILE, newline='', encoding='utf-8-sig') as f:
reader = csv.DictReader(f, delimiter=';')
for row in reader:
member = {
"uuids": [u.strip() for u in row.get("UUID", "").strip('"').split("|") if u.strip()],
"name": row.get("Name", ""),
"email": row.get("EmailAddress", ""),
"firstName": row.get("FirstName", ""),
"surname": row.get("Surname", ""),
"fullName": row.get("FullName", ""),
"title": row.get("Title", ""),
"headOfDepartment": str(row.get("HeadOfDepartment", "False")).lower() == "true",
"mobileNumber": row.get("MobilePhone", ""),
"location": row.get("Location", ""),
"lockForDeletion": str(row.get("lockForDeletion", "False")).lower() == "true",
"roles": [r.strip() for r in row.get("Roles", "").strip('"').split("|") if r.strip()],
"categories": [c.strip() for c in row.get("Categories", "").strip('"').split("|") if c.strip()],
"organizations": [o.strip() for o in row.get("Organizations", "").strip('"').split("|") if o.strip()]
}
members.append(member)

 

headers = {"x-api-key": API_KEY, "Origin": ORIGIN, "Content-Type": "application/json"}
response = requests.post(API_ENDPOINT, json={"members": members}, headers=headers)

 

if response.status_code == 200:
print("Success")
else:
print(f"Error: {response.status_code} - {response.text}")

Member Import FAQ

Her findes svar på de spørgsmål vi har modtaget fra andre kunder. Hvis ikke der findes et svar på det spørgsmål I sidder med, så er I meget velkomne til at skrive til os, så vi kan hjælpe med svar.

Fejl '403 Forbidden' / '403 Access Denied' kommer, når der er en restriktion på sitet, der forhindrer kaldet i at gå igennem fra den IP-adresse du sidder på.

Du skal derfor tjekke din IP-adresse og fremsende den til os, så vi kan whiteliste den.

Hvis importen fejler med beskeden om at rollen ikke er fundet, skal du logge ind i backoffice og tjekke, at rollen er oprettet under 'Member roles'.

Første gang lockForDeletion sættes til "true", vil medlemmet blive låst og slettet efter 30 dage.

Sendes denne string med i flere gentagne uploads, vil det derfor være den første, der er gældende. 

Hvis I har f.eks. både et dansk og et engelsk site, og I benytter felter, hvor indhold skal vise på henholdsvis dansk og engelsk, så skal personerne oprettes 

Requestet der sendes til vores API, skal være i JSON-format.