Umbraco-pakke
CitationLab-pakken for Umbraco
CitationLab.Umbraco kobler et Umbraco-nettsted til AI Marketing Manager. Når koblingen er på plass, kan Manager lese innholdet og oppdatere SEO-metadata, strukturerte data, media og omdirigeringer, og utviklerne får et dokumentert REST API på deres eget domene. Skrevet for nettstedseiere, Umbraco-utviklere og byråer som drifter nettsteder for kunder.
Pakken kort fortalt
- Pakke
- CitationLab.Umbraco
- Versjon
- 2.0.0
- Umbraco
- 13 LTS
- Kjøremiljø
- .NET 8
- Lisens
- MIT
dotnet add package CitationLab.UmbracoKrav
Sjekk dette før du installerer.
Umbraco 13 LTS på .NET 8
Dette er versjonen pakken er laget for.
Umbraco 14 og nyere: ikke ennå
Umbraco 14 endret hvordan utvidelser i backoffice bygges, så dashbordet må skrives om før pakken støtter det. API-delen påvirkes ikke av den endringen.
Utgående HTTPS
Webserveren må nå manager.citationlab.ai over HTTPS, ellers feiler tilkoblingen.
En administrator
Tilkobling og funksjonsbrytere ligger i et dashbord som bare brukere i Umbracos admin-gruppe ser.
1. Installer
Legg pakken til i prosjektet som kjører Umbraco-nettstedet.
dotnet add package CitationLab.Umbraco- 1
Legg til pakken
Kjør dotnet add package CitationLab.Umbraco fra mappen til Umbraco-webprosjektet.
- 2
Bygg på nytt
Bygg løsningen slik dere pleier, og deploy den.
- 3
Start nettstedet på nytt
Ved oppstart lager pakken sine egne databasetabeller. Verken innhold eller maler blir rørt.
Valgfri konfigurasjon
Konfigurasjon trengs bare hvis pakken skal snakke med en annen Manager, for eksempel et testmiljø. Uten den bruker pakken manager.citationlab.ai.
{
"CitationLab": {
"ManagerUrl": "https://manager.citationlab.ai"
}
}Feil fra pakken skrives til den vanlige Umbraco-loggen med prefikset [citationlab], så du kan filtrere på dem.
2. Koble til AI Marketing Manager
Tilkoblingen gir nettstedet en permanent API-nøkkel og forteller Manager hvor nettstedet ligger. Du trenger et token fra Manager og ett klikk i Umbraco-backoffice.
- 1
Lag et tilkoblingstoken i Manager
Åpne prosjektet i AI Marketing Manager, gå til Integrations → Umbraco → Connect og velg “Generate pairing token”.
- 2
Åpne CitationLab-dashbordet
Logg inn i Umbraco-backoffice som administrator, åpne Content-seksjonen og velg dashbordet “CitationLab”.
- 3
Lim inn tokenet og klikk “Pair”
Nettstedet sender tokenet, sin egen URL og grunnleggende informasjon om nettstedet til Manager, og får API-nøkkelen tilbake. Dashbordet viser deretter nettstedet som tilkoblet.
- Et token kan brukes én gang og utløper etter 15 minutter. Lag et nytt hvis det går ut.
- Koble til fra backoffice på det offentlige vertsnavnet. Manager lagrer adressen du sto på da du klikket Pair, så en tilkobling fra localhost eller et internt navn gir Manager en adresse den ikke kan bruke.
- Tilkoblingen krever innlogging i backoffice med vilje: den avgjør hvem som kan lese og skrive hele nettstedet, så det holder ikke å kjenne nettstedets URL.
- Ett Umbraco-nettsted per prosjekt. Kobler du til et prosjekt som allerede har en kobling, erstattes URL og nøkkel i den koblingen.
- For å koble fra bruker du “Disconnect” i dashbordet, som fjerner nøkkelen som er lagret på nettstedet, eller du fjerner koblingen i Manager, som sletter koblingen og Managers mellomlagrede kopi av innholdet. Å fjerne den i Manager endrer ingenting på Umbraco-nettstedet.
3. Velg hva pakken skal gjøre
Installasjonen endrer ingen sider på nettstedet. Bare synkroniseringsgruppen er på fra start, slik at Manager kan lese innholdet. Alt som ville endret HTML-en, håndtert forespørsler eller samlet inn besøksdata, er av til du slår det på.
| Gruppe | Standard | Hva den dekker | Brytere |
|---|---|---|---|
| Synkronisering | På | Lesing av innhold, SEO-felt, media, taksonomi og dokumenttyper, og pakkens revisjonslogg over hver endring. | content_syncseo_syncmedia_accesstaxonomy_syncdocument_type_syncaudit_log |
| Sideutdata | Av | Det pakken skriver inn i sidene og nettstedets filer: meta- og Open Graph-tagger, strukturerte data, brødsmuler, egne og verifiseringstagger, robots.txt, sitemap, llms.txt og andre AI-rettede filer. | meta_outputschema_outputog_outputbreadcrumbscustom_meta_tagsverification_tagsrobots_managementsitemapllms_txtaeo |
| Forespørsler | Av | Omdirigeringer, logg over 404-er, lenkeskanner og integritetssjekk. | redirectsmonitor_404link_scannerintegrity_checker |
| Besøksdata | Av | Sporing og botsporing, sidevisninger fra serveren, tag manager og samtykke, GA4 e-handel, A/B-tester, varmekart, scrollkart, Web Vitals og spørreundersøkelser. | trackingbot_trackingserver_pageviewtag_managerconsentga4_ecommerceab_testingheatmapscrollmapweb_vitalssurveys |
| Integrasjoner | Av | Umbraco Commerce, Umbraco Forms, medlemmer, ordboken, webhooks, e-postvarsler og Cloudflare. | commerceformsmembersdictionarywebhooksemail_alertscloudflare |
Hvor du slår funksjoner av og på
En administrator slår funksjoner av og på under Features i CitationLab-dashbordet. Utviklere kan gjøre det samme gjennom API-et med PUT features. Manager leser hva som er slått på via GET capabilities, som rapporterer både hva installasjonen kan og hva som er aktivert. Et kall til en funksjon som er av, svarer 403 med koden feature_disabled.
4. API-referanse
Pakken leverer et REST API fra deres eget Umbraco-nettsted. Det er dette API-et Manager bruker etter tilkoblingen, og utviklerne deres kan bruke det også. Det er noe annet enn Managers eget REST API, som er beskrevet under Ressurser → API.
Managers REST API →Base-URL
Alle ruter ligger under denne stien på nettstedets eget domene:
https://your-site.example/umbraco/citationlab/v1/Autentisering
- Send nøkkelen fra tilkoblingen som bearer-token: Authorization: Bearer cl_um_… Nøkkelen er cl_um_ fulgt av 40 heksadesimale tegn.
- GET health er åpen og krever ingen nøkkel.
- Tilkoblingsrutene (pair, pairing-status, disconnect) godtar ikke nøkkelen. De krever en innlogget backoffice-økt.
Konvensjoner
- Spørreparametere skrives i snake_case: per_page, document_type_alias, parent_id, order_by, include_properties.
- Forespørsels- og svarkropper er JSON i camelCase.
- Lister pagineres og returnerer items, total, page, perPage og totalPages. per_page er 100 som standard og maks 500.
- Lesing og skriving av innhold tar en valgfri culture-parameter. Ett språk kan publiseres alene med POST content/{id}/translations/{culture}/publish.
- En nodes {id} er GUID-nøkkelen eller den numeriske id-en.
Feil
Alle feil har samme form: error er en lesbar melding, code er en av verdiene under, og details er med når det er mer å si.
| Kode | HTTP | Betydning |
|---|---|---|
invalid_request | 400 | Forespørselen er feil formet, en parameter har ugyldig verdi, eller en påkrevd kropp mangler. |
feature_disabled | 403 | Funksjonen bak ruten er slått av. details.feature sier hvilken bryter det gjelder. |
not_found | 404 | Noden, mediefilen eller posten finnes ikke. |
operation_failed | 500 | Umbraco klarte ikke å fullføre operasjonen. Nettstedets logg har detaljene. |
unsupported | 501 | Nettstedet kan ikke gjøre dette, for eksempel fordi et nødvendig Umbraco-tillegg ikke er installert. |
HTTP/1.1 403 Forbidden
{
"error": "Feature 'redirects' is disabled on this site",
"code": "feature_disabled",
"details": { "feature": "redirects" }
}Endepunkter
Hovedrutene i hver gruppe, relativt til base-URL-en. Hver gruppe lister også flere ressurser den inneholder.
Oppdagelse
| Metode | Sti | Hva den gjør |
|---|---|---|
| GET | health | Kjører pakken? Åpen, ingen nøkkel. |
| GET | version | Installert pakkeversjon. |
| GET | site-info | Nettstedets navn, URL og Umbraco-versjon. |
| GET | capabilities | Hva installasjonen kan, og hva som er slått på. |
| GET | features | Funksjonsbryterne slik de står nå. |
| PUT | features | Slå funksjoner av eller på. |
Innhold
| Metode | Sti | Hva den gjør |
|---|---|---|
| GET | content | Paginert liste. Filtre: status (published, draft, trashed), document_type_alias, search, culture, parent_id, order_by, direction, include_properties. |
| POST | content | Opprett en node. |
| GET · PUT · DELETE | content/{id} | Les, oppdater eller slett én node. |
| GET | content/by-path | Finn en node ut fra URL-stien. |
| GET | content/{id}/children | Nodens barn. |
| POST | content/{id}/publish | Publiser. |
| POST | content/{id}/unpublish | Avpubliser. |
| POST | content/{id}/move | Flytt under en annen forelder. |
| POST | content/{id}/copy | Kopier. |
| GET | content/{id}/preview-url | Forhåndsvisningslenke for upubliserte endringer. |
| GET | content/{id}/tags | Nodens tagger. |
Versjoner, planlegging og språk
| Metode | Sti | Hva den gjør |
|---|---|---|
| GET | content/{id}/versions | Versjonshistorikk. |
| GET | content/{id}/versions/{versionId} | Én tidligere versjon. |
| POST | content/{id}/versions/{versionId}/restore | Rull tilbake til den versjonen. |
| GET · PUT | content/{id}/schedule | Planlagte datoer for publisering og avpublisering. |
| GET | languages | Nettstedets språk. |
| GET | content/{id}/translations | Hvilke språk en node finnes på. |
| POST | content/{id}/translations/{culture}/publish | Publiser bare ett språk. |
Masseoperasjoner, søk og dokumenttyper
| Metode | Sti | Hva den gjør |
|---|---|---|
| POST | bulk/content/status | Publiser eller avpubliser mange noder. |
| POST | bulk/content/update | Oppdater mange noder. |
| POST | bulk/content/delete | Slett mange noder. |
| POST | bulk/seo-meta | Sett SEO-felt på mange noder. |
| GET | search | Søk i nettstedets egen Examine-indeks, sortert etter relevans. |
| GET | search/indexes | Tilgjengelige Examine-indekser. |
| GET | document-types | Alle dokumenttyper. |
| GET | document-types/{alias} | Én dokumenttype med egenskaper. |
SEO, strukturerte data og AI-filer
| Metode | Sti | Hva den gjør |
|---|---|---|
| GET · PUT | seo-meta/{id} | Tittel, beskrivelse, fokusord, canonical og robots-innstillinger for en node. |
| GET · PUT | content/{id}/og | Open Graph- og delingskort-felt. |
| GET · PUT | llms | Nettstedets llms.txt. |
| POST | llms/generate | Foreslå en llms.txt ut fra nettstedets struktur. Forslaget returneres og lagres ikke. |
| GET · PUT | aeo | Innstillinger for de AI-rettede filene, og adressen hver av dem leveres på. |
Også i denne gruppen: meta-templates custom-meta-tags settings/verification-tags breadcrumbs term-meta seo-lock robots sitemap schema schema-graph entities citation-check ai-visibility
Omdirigeringer og 404
| Metode | Sti | Hva den gjør |
|---|---|---|
| GET · POST | redirects | List opp eller opprett omdirigeringer. |
| GET · PUT · DELETE | redirects/{id} | Les, endre eller fjern én omdirigering. |
| POST | redirects/import | Importer omdirigeringer. |
| GET | redirects/export | Eksporter omdirigeringer. |
| GET | 404-log | Loggede 404-er, med ruter for å lage omdirigeringer fra dem. |
Også i denne gruppen: redirects/settings 404-log/stats link-scan integrity
Media
| Metode | Sti | Hva den gjør |
|---|---|---|
| GET · POST | media | List opp eller last opp media. |
| GET · PUT · DELETE | media/{id} | Les, endre eller slett en mediefil. |
| POST | media/{id}/file | Bytt ut filen. |
| GET | media/{id}/usage | Hvor filen er i bruk. |
| POST | media/folder | Opprett en mediemappe. |
| GET | media-types | Nettstedets medietyper. |
Også i denne gruppen: alt-text/scan alt-text/stats alt-text/bulk-update
Drift
| Metode | Sti | Hva den gjør |
|---|---|---|
| GET | audit-log | Hver endring gjort gjennom pakken, med forrige verdi. |
| POST | audit-log/{id}/restore | Sett forrige verdi tilbake. |
| GET · PUT | settings/webhook | Mottaker-URL og hemmelighet for webhooks. Hemmeligheten returneres aldri. |
| POST | settings/webhook/test | Send en signert testlevering. |
Også i denne gruppen: site-health alerts cloudflare migration compat tracking bot-log pageview tag-manager consent ga4-ecommerce
Spesifikt for Umbraco
| Metode | Sti | Hva den gjør |
|---|---|---|
| GET | dictionary | Ordbokelementer i Umbraco. |
| PUT | dictionary/{key} | Endre et ordbokelement. |
| GET | members | Umbraco-medlemmer. |
| GET | forms | Umbraco Forms, når det er installert. |
| GET | commerce/products | Produkter i Umbraco Commerce, når det er installert. |
| GET | commerce/orders | Ordrer i Umbraco Commerce. |
Også i denne gruppen: member-groups member-types commerce/customers commerce/categories
Umbraco Forms og Umbraco Commerce leses gjennom en bro som ser etter dem mens nettstedet kjører, så pakken kan installeres og kjøre på nettsteder uten de lisensene. Rutene svarer da med unsupported.
Filer som leveres fra roten av nettstedet
Med de tilhørende sideutdata-bryterne på svarer pakken også på disse adressene på domenet:
/robots.txt/sitemap.xml/llms.txt/llms-full.txt/ai.json/.well-known/ai.json/ai-info
Eksempler
curl https://your-site.example/umbraco/citationlab/v1/capabilities \
-H "Authorization: Bearer cl_um_YOUR_API_KEY"curl "https://your-site.example/umbraco/citationlab/v1/content?page=2&per_page=50&status=published&culture=en-US" \
-H "Authorization: Bearer cl_um_YOUR_API_KEY"{
"items": [ … ],
"total": 412,
"page": 2,
"perPage": 50,
"totalPages": 9
}curl -X PUT "https://your-site.example/umbraco/citationlab/v1/seo-meta/NODE_KEY?culture=en-US" \
-H "Authorization: Bearer cl_um_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Plumbing services in Oslo",
"description": "Emergency and planned plumbing, 24/7.",
"canonical": "https://your-site.example/services/plumbing/",
"noindex": false
}'5. Webhooks
Pakken kan sende et signert varsel til et HTTPS-endepunkt dere velger når innhold eller media endres: deres egen tjeneste, eller et automasjonsverktøy som Zapier, Make eller n8n.
- 1
Slå på webhooks-bryteren
Funksjonen webhooks er av som standard.
- 2
Sett mottakeren
PUT settings/webhook med url (http eller https) og secret. GET settings/webhook viser url og hasSecret, aldri selve hemmeligheten.
- 3
Send en test
POST settings/webhook/test sender en signert testhendelse, så du kan sjekke mottakeren før en ekte endring.
Ingenting sendes før bryteren er på og både url og secret er satt. Tilkoblingen til Manager peker allerede webhooken mot CitationLab Manager med en egen hemmelighet, så det holder å slå på bryteren for at Manager skal se en publisert endring i løpet av sekunder. Setter dere opp en egen mottaker, lar Manager den være.
curl -X PUT https://your-site.example/umbraco/citationlab/v1/settings/webhook \
-H "Authorization: Bearer cl_um_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://hooks.example.com/umbraco", "secret": "a-long-random-string" }'Hendelser
| Hendelse | Sendes når |
|---|---|
content.saved | En innholdsnode lagres. |
content.published | En innholdsnode publiseres. |
content.unpublished | En innholdsnode avpubliseres. |
content.trashed | En innholdsnode flyttes til papirkurven. |
content.deleted | En innholdsnode slettes for godt. |
media.saved | En mediefil lagres. |
media.deleted | En mediefil slettes. |
Slik ser en levering ut
En JSON-POST med event, siteUrl, timestamp (Unix-sekunder) og data. Felt som er null, utelates. X-CL-Event gjentar hendelsesnavnet, og X-CL-Signature inneholder signaturen.
POST /umbraco HTTP/1.1
Host: hooks.example.com
Content-Type: application/json; charset=utf-8
X-CL-Event: content.published
X-CL-Signature: 3f1c…e9a0
{
"event": "content.published",
"siteUrl": "https://your-site.example",
"timestamp": 1760000000,
"data": { "id": "NODE_KEY", … }
}Verifiser signaturen
X-CL-Signature er HMAC-SHA256 av den nøyaktige, rå forespørselskroppen med hemmeligheten som nøkkel, som heksadesimal med små bokstaver. Regn den ut over de rå bytene før du parser JSON-en, og sammenlign med en funksjon som bruker konstant tid. Serialiserer du den parsede kroppen på nytt, endres bytene og sjekken feiler.
import crypto from "node:crypto";
import express from "express";
const app = express();
const SECRET = process.env.CL_WEBHOOK_SECRET;
// Keep the raw bytes: the signature covers the body exactly as sent.
app.post("/umbraco", express.raw({ type: "application/json" }), (req, res) => {
const expected = crypto.createHmac("sha256", SECRET).update(req.body).digest("hex");
const received = req.get("X-CL-Signature") ?? "";
const valid =
received.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected));
if (!valid) return res.sendStatus(401);
const payload = JSON.parse(req.body.toString("utf8"));
console.log(req.get("X-CL-Event"), payload.data);
res.sendStatus(204);
});using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
app.MapPost("/umbraco", async (HttpRequest request, IConfiguration config) =>
{
// Keep the raw bytes: the signature covers the body exactly as sent.
using var buffer = new MemoryStream();
await request.Body.CopyToAsync(buffer);
var body = buffer.ToArray();
var key = Encoding.UTF8.GetBytes(config["CitationLab:WebhookSecret"]!);
var expected = Convert.ToHexString(HMACSHA256.HashData(key, body)).ToLowerInvariant();
var received = request.Headers["X-CL-Signature"].ToString();
if (!CryptographicOperations.FixedTimeEquals(
Encoding.ASCII.GetBytes(expected), Encoding.ASCII.GetBytes(received)))
return Results.Unauthorized();
using var payload = JsonDocument.Parse(body);
return Results.NoContent();
});Levering og nye forsøk
- Leveringer legges i kø og sendes utenom lagringen. Lagring i backoffice venter aldri på mottakeren.
- Alle statuskoder under 400 regnes som levert.
- Etter nettverksfeil, tidsavbrudd, 5xx, 408 eller 429 prøver pakken to ganger til: etter 1 sekund og etter 3 sekunder. Andre 4xx-svar prøves ikke på nytt.
- Når alle tre forsøkene feiler, gir pakken opp og skriver en [citationlab]-advarsel i Umbraco-loggen. Bruk hendelsen som et signal om å hente gjeldende tilstand fra API-et, ikke som den eneste kopien av endringen.
Sikkerhet og personvern
Tilkobling krever backoffice-innlogging
Bare en administrator som er logget inn i backoffice, kan koble til et nettsted. En URL alene kobler ingenting.
Hvor nøkkelen ligger
På nettstedet lagres nøkkelen i App_Data/CitationLab/apikey.json. Behandle filen som et passord, og hold App_Data utenfor kildekontrollen. Manager lagrer sin kopi kryptert.
Av til du slår på
Bare lesing er på etter installasjon. Sideutdata, forespørsler, besøksdata og integrasjoner krever hver sin bevisste bryter.
Ingen rå IP-adresser
Når sporing er på, lagrer pakken aldri besøkendes rå IP-adresse.
Hver endring logges
Pakken har sin egen revisjonslogg over hver endring som går gjennom den, med forrige verdi, og en endring kan rulles tilbake. Endringer fra Manager logges i Manager også.
Hemmeligheter blir der de er
Webhook-hemmeligheten kan bare skrives via API-et: lesing returnerer hasSecret, aldri verdien.
Feilsøking
| Det du ser | Hva du gjør |
|---|---|
| Pairing token not found | Kopier tokenet på nytt fra Manager, eller lag et nytt. Har du satt CitationLab:ManagerUrl, må tokenet komme fra den Manageren. |
| Pairing token already used | Et token virker én gang. Lag et nytt. |
| Pairing token expired | Et token gjelder i 15 minutter. Lag et nytt og koble til med en gang. |
| Could not reach CitationLab Manager: … | Webserveren kan ikke gjøre utgående HTTPS-kall til manager.citationlab.ai. Åpne for det i brannmur eller proxy og prøv igjen. |
| Ikke noe CitationLab-dashbord i Content-seksjonen | Brukeren din er ikke i admin-gruppen, eller nettstedet kjører Umbraco 14 eller nyere, som dashbordet ikke støtter ennå. |
| 403 med koden feature_disabled | Ruten hører til en funksjon som er av. details.feature sier hvilken. Slå den på under Features i dashbordet. |
| Manager viser localhost eller en intern adresse | Nettstedet ble koblet til fra den adressen. Koble til på nytt fra backoffice på det offentlige vertsnavnet; det erstatter den lagrede URL-en. |
| Webhooks kommer aldri frem | Sjekk at webhooks-bryteren er på og at både url og secret er satt, og send POST settings/webhook/test. Mislykkede leveringer logges med [citationlab]. |
Vanlige spørsmål
Nei. Etter installasjon leser pakken bare innhold, slik at Manager kan synkronisere det. Ingenting skrives inn i sidene, ingen forespørsler omdirigeres og ingen besøksdata samles inn før en administrator slår de funksjonene på.
Umbraco 13 LTS på .NET 8. Umbraco 14 og nyere støttes ikke ennå, fordi modellen for backoffice-utvidelser er endret og dashbordet må skrives om. API-delen påvirkes ikke av den endringen.
I 15 minutter, og det kan brukes én gang. Har det utløpt eller er brukt, lager du et nytt i Manager under Integrations → Umbraco.
Ja. API-et kjører på deres eget nettsted og godtar nøkkelen nettstedet fikk ved tilkoblingen, sendt som bearer-token. Nøkkelen ligger på serveren i App_Data/CitationLab/apikey.json.
Ja. All lesing og skriving av innhold tar en valgfri culture, og du kan publisere ett språk alene.
Kobler du fra i dashbordet, fjernes nøkkelen som er lagret på nettstedet. Fjerner du koblingen i Manager, slettes koblingen og Managers mellomlagrede innhold; selve Umbraco-nettstedet endres ikke.
Ja. Pek dem mot et hvilket som helst HTTPS-endepunkt dere kontrollerer, som en egen tjeneste, Zapier, Make eller n8n, og verifiser X-CL-Signature-headeren med hemmeligheten.
Drifter du Umbraco for en kunde?
Fortell oss om nettstedet og hva Manager skal ta seg av, så hjelper vi deg med tilkobling og oppsett.
Var dette nyttig?

