Hoppa till innehåll
CitationLab

Umbraco-paket

CitationLab-paketet för Umbraco

CitationLab.Umbraco kopplar en Umbraco-webbplats till AI Marketing Manager. När kopplingen är klar kan Manager läsa innehållet och uppdatera SEO-metadata, strukturerad data, media och omdirigeringar, och era utvecklare får ett dokumenterat REST API på er egen domän. Skrivet för webbplatsägare, Umbraco-utvecklare och byråer som förvaltar webbplatser åt kunder.

Paketet i korthet

Paket
CitationLab.Umbraco
Version
2.0.0
Umbraco
13 LTS
Körmiljö
.NET 8
Licens
MIT
dotnet add package CitationLab.Umbraco

Krav

Kontrollera det här innan du installerar.

  • Umbraco 13 LTS på .NET 8

    Det är den version paketet är byggt för.

  • Umbraco 14 och senare: inte än

    Umbraco 14 ändrade hur tillägg till backoffice byggs, så dashboarden måste skrivas om innan paketet stöder det. API-delen påverkas inte av den ändringen.

  • Utgående HTTPS

    Webbservern måste nå manager.citationlab.ai över HTTPS, annars misslyckas kopplingen.

  • En administratör

    Koppling och funktionsbrytare finns i en dashboard som bara användare i Umbracos admin-grupp ser.

1. Installera

Lägg till paketet i projektet som kör er Umbraco-webbplats.

dotnet add package CitationLab.Umbraco
  1. 1

    Lägg till paketet

    Kör dotnet add package CitationLab.Umbraco från mappen för ert Umbraco-webbprojekt.

  2. 2

    Bygg om

    Bygg lösningen som ni brukar och driftsätt den.

  3. 3

    Starta om webbplatsen

    Vid uppstart skapar paketet sina egna databastabeller. Inget innehåll och inga mallar rörs.

Valfri konfiguration

Konfiguration behövs bara om paketet ska prata med en annan Manager, till exempel en testmiljö. Utan den använder paketet manager.citationlab.ai.

appsettings.json
{
  "CitationLab": {
    "ManagerUrl": "https://manager.citationlab.ai"
  }
}

Fel från paketet skrivs till den vanliga Umbraco-loggen med prefixet [citationlab], så att du kan filtrera fram dem.

2. Koppla till AI Marketing Manager

Kopplingen ger webbplatsen en permanent API-nyckel och talar om för Manager var webbplatsen finns. Du behöver en token från Manager och ett klick i Umbracos backoffice.

  1. 1

    Skapa en kopplingstoken i Manager

    Öppna projektet i AI Marketing Manager, gå till Integrations → Umbraco → Connect och välj “Generate pairing token”.

  2. 2

    Öppna CitationLab-dashboarden

    Logga in i Umbracos backoffice som administratör, öppna sektionen Content och välj dashboarden “CitationLab”.

  3. 3

    Klistra in token och klicka på “Pair”

    Webbplatsen skickar token, sin egen URL och grundläggande uppgifter om webbplatsen till Manager och får sin API-nyckel tillbaka. Dashboarden visar sedan webbplatsen som kopplad.

  • En token fungerar en gång och går ut efter 15 minuter. Skapa en ny om den hinner gå ut.
  • Koppla från backoffice på det publika värdnamnet. Manager sparar adressen du var på när du klickade på Pair, så en koppling från localhost eller ett internt namn ger Manager en adress den inte kan använda.
  • Kopplingen kräver inloggning i backoffice med avsikt: den avgör vem som får läsa och skriva hela webbplatsen, så det räcker inte att känna till webbplatsens URL.
  • En Umbraco-webbplats per projekt. Kopplar du ett projekt som redan har en koppling ersätts URL och nyckel i den kopplingen.
  • Koppla bort med “Disconnect” i dashboarden, som tar bort nyckeln som är sparad på webbplatsen, eller ta bort kopplingen i Manager, vilket raderar kopplingen och Managers cachade kopia av innehållet. Att ta bort den i Manager ändrar ingenting på Umbraco-webbplatsen.

3. Välj vad paketet ska göra

Installationen ändrar ingen sida på webbplatsen. Bara synkgruppen är påslagen från början, så att Manager kan läsa innehållet. Allt som skulle ändra er HTML, hantera förfrågningar eller samla in besöksdata är avstängt tills du slår på det.

3. Välj vad paketet ska göra
GruppStandardVad den omfattarBrytare
SynkPåLäsning av innehåll, SEO-fält, media, taxonomi och dokumenttyper, samt paketets granskningslogg över varje ändring.content_syncseo_syncmedia_accesstaxonomy_syncdocument_type_syncaudit_log
SidutdataAvDet paketet skriver in i sidorna och webbplatsens filer: meta- och Open Graph-taggar, strukturerad data, brödsmulor, egna taggar och verifieringstaggar, robots.txt, sitemap, llms.txt och andra AI-riktade filer.meta_outputschema_outputog_outputbreadcrumbscustom_meta_tagsverification_tagsrobots_managementsitemapllms_txtaeo
FörfrågningarAvOmdirigeringar, logg över 404-fel, länkskanner och integritetskontroll.redirectsmonitor_404link_scannerintegrity_checker
BesöksdataAvSpårning och botspårning, sidvisningar från servern, tag manager och samtycke, GA4 e-handel, A/B-tester, värmekartor, scrollkartor, Web Vitals och enkäter.trackingbot_trackingserver_pageviewtag_managerconsentga4_ecommerceab_testingheatmapscrollmapweb_vitalssurveys
IntegrationerAvUmbraco Commerce, Umbraco Forms, medlemmar, ordlistan, webhooks, e-postaviseringar och Cloudflare.commerceformsmembersdictionarywebhooksemail_alertscloudflare

Var du slår av och på funktioner

En administratör slår av och på funktioner under Features i CitationLab-dashboarden. Utvecklare kan göra samma sak via API:et med PUT features. Manager läser vad som är påslaget via GET capabilities, som rapporterar både vad installationen klarar och vad som är aktiverat. Ett anrop till en avstängd funktion svarar 403 med koden feature_disabled.

4. API-referens

Paketet tillhandahåller ett REST API från er egen Umbraco-webbplats. Det är det API som Manager använder efter kopplingen, och era utvecklare kan också använda det. Det är skilt från Managers eget REST API, som beskrivs under Resurser → API.

Managers REST API →

Bas-URL

Alla rutter ligger under den här sökvägen på webbplatsens egen domän:

https://your-site.example/umbraco/citationlab/v1/

Autentisering

  • Skicka nyckeln från kopplingen som bearer-token: Authorization: Bearer cl_um_… Nyckeln är cl_um_ följt av 40 hexadecimala tecken.
  • GET health är öppen och kräver ingen nyckel.
  • Kopplingsrutterna (pair, pairing-status, disconnect) godtar inte nyckeln. De kräver en inloggad backoffice-session.

Konventioner

  • Frågeparametrar skrivs i snake_case: per_page, document_type_alias, parent_id, order_by, include_properties.
  • Förfrågnings- och svarskroppar är JSON i camelCase.
  • Listor pagineras och returnerar items, total, page, perPage och totalPages. per_page är 100 som standard och högst 500.
  • Läsning och skrivning av innehåll tar en valfri culture-parameter. Ett språk kan publiceras ensamt med POST content/{id}/translations/{culture}/publish.
  • En nods {id} är dess GUID-nyckel eller dess numeriska id.

Fel

Alla fel har samma form: error är ett läsbart meddelande, code är ett av värdena nedan och details finns med när det finns mer att säga.

Fel
KodHTTPBetydelse
invalid_request400Förfrågan är felaktigt formad, en parameter har fel värde eller en obligatorisk kropp saknas.
feature_disabled403Funktionen bakom rutten är avstängd. details.feature anger vilken brytare det gäller.
not_found404Noden, mediefilen eller posten finns inte.
operation_failed500Umbraco kunde inte slutföra åtgärden. Webbplatsens logg har detaljerna.
unsupported501Webbplatsen kan inte göra detta, till exempel för att ett nödvändigt Umbraco-tillägg inte är installerat.
Ett anrop till en avstängd funktion
HTTP/1.1 403 Forbidden

{
  "error": "Feature 'redirects' is disabled on this site",
  "code": "feature_disabled",
  "details": { "feature": "redirects" }
}

Endpoints

De viktigaste rutterna i varje grupp, relativt bas-URL:en. Varje grupp listar också fler resurser som ingår.

Upptäckt

Upptäckt
MetodSökvägVad den gör
GEThealthKör paketet? Öppen, ingen nyckel.
GETversionInstallerad paketversion.
GETsite-infoWebbplatsens namn, URL och Umbraco-version.
GETcapabilitiesVad installationen klarar och vad som är påslaget.
GETfeaturesFunktionsbrytarna som de står nu.
PUTfeaturesSlå av eller på funktioner.

Innehåll

Innehåll
MetodSökvägVad den gör
GETcontentPaginerad lista. Filter: status (published, draft, trashed), document_type_alias, search, culture, parent_id, order_by, direction, include_properties.
POSTcontentSkapa en nod.
GET · PUT · DELETEcontent/{id}Läs, uppdatera eller radera en nod.
GETcontent/by-pathHitta en nod utifrån URL-sökvägen.
GETcontent/{id}/childrenNodens barn.
POSTcontent/{id}/publishPublicera.
POSTcontent/{id}/unpublishAvpublicera.
POSTcontent/{id}/moveFlytta till en annan förälder.
POSTcontent/{id}/copyKopiera.
GETcontent/{id}/preview-urlEn förhandsvisningslänk för opublicerade ändringar.
GETcontent/{id}/tagsNodens taggar.

Versioner, schemaläggning och språk

Versioner, schemaläggning och språk
MetodSökvägVad den gör
GETcontent/{id}/versionsVersionshistorik.
GETcontent/{id}/versions/{versionId}En tidigare version.
POSTcontent/{id}/versions/{versionId}/restoreÅterställ till den versionen.
GET · PUTcontent/{id}/scheduleSchemalagda datum för publicering och avpublicering.
GETlanguagesWebbplatsens språk.
GETcontent/{id}/translationsVilka språk en nod finns på.
POSTcontent/{id}/translations/{culture}/publishPublicera bara ett språk.

Massåtgärder, sök och dokumenttyper

Massåtgärder, sök och dokumenttyper
MetodSökvägVad den gör
POSTbulk/content/statusPublicera eller avpublicera många noder.
POSTbulk/content/updateUppdatera många noder.
POSTbulk/content/deleteRadera många noder.
POSTbulk/seo-metaSätt SEO-fält på många noder.
GETsearchSök i webbplatsens eget Examine-index, sorterat efter relevans.
GETsearch/indexesTillgängliga Examine-index.
GETdocument-typesAlla dokumenttyper.
GETdocument-types/{alias}En dokumenttyp med dess egenskaper.

SEO, strukturerad data och AI-filer

SEO, strukturerad data och AI-filer
MetodSökvägVad den gör
GET · PUTseo-meta/{id}Titel, beskrivning, fokusord, canonical och robots-inställningar för en nod.
GET · PUTcontent/{id}/ogFält för Open Graph och delningskort.
GET · PUTllmsWebbplatsens llms.txt.
POSTllms/generateFöreslå en llms.txt utifrån webbplatsens struktur. Förslaget returneras och sparas inte.
GET · PUTaeoInställningar för de AI-riktade filerna och adressen där var och en levereras.

Ingår också i gruppen: meta-templates custom-meta-tags settings/verification-tags breadcrumbs term-meta seo-lock robots sitemap schema schema-graph entities citation-check ai-visibility

Omdirigeringar och 404

Omdirigeringar och 404
MetodSökvägVad den gör
GET · POSTredirectsLista eller skapa omdirigeringar.
GET · PUT · DELETEredirects/{id}Läs, ändra eller ta bort en omdirigering.
POSTredirects/importImportera omdirigeringar.
GETredirects/exportExportera omdirigeringar.
GET404-logLoggade 404-fel, med rutter för att skapa omdirigeringar från dem.

Ingår också i gruppen: redirects/settings 404-log/stats link-scan integrity

Media

Media
MetodSökvägVad den gör
GET · POSTmediaLista eller ladda upp media.
GET · PUT · DELETEmedia/{id}Läs, ändra eller radera en mediefil.
POSTmedia/{id}/fileByt ut filen.
GETmedia/{id}/usageVar filen används.
POSTmedia/folderSkapa en mediemapp.
GETmedia-typesWebbplatsens medietyper.

Ingår också i gruppen: alt-text/scan alt-text/stats alt-text/bulk-update

Drift

Drift
MetodSökvägVad den gör
GETaudit-logVarje ändring som gjorts via paketet, med föregående värde.
POSTaudit-log/{id}/restoreSätt tillbaka föregående värde.
GET · PUTsettings/webhookMottagar-URL och hemlighet för webhooks. Hemligheten returneras aldrig.
POSTsettings/webhook/testSkicka en signerad testleverans.

Ingår också i gruppen: site-health alerts cloudflare migration compat tracking bot-log pageview tag-manager consent ga4-ecommerce

Specifikt för Umbraco

Specifikt för Umbraco
MetodSökvägVad den gör
GETdictionaryOrdlisteposter i Umbraco.
PUTdictionary/{key}Ändra en ordlistepost.
GETmembersUmbraco-medlemmar.
GETformsUmbraco Forms, när det är installerat.
GETcommerce/productsProdukter i Umbraco Commerce, när det är installerat.
GETcommerce/ordersOrdrar i Umbraco Commerce.

Ingår också i gruppen: member-groups member-types commerce/customers commerce/categories

Umbraco Forms och Umbraco Commerce läses via en brygga som letar efter dem medan webbplatsen körs, så paketet kan installeras och köras på webbplatser utan de licenserna. Rutterna svarar då med unsupported.

Filer som levereras från webbplatsens rot

Med motsvarande brytare för sidutdata påslagna svarar paketet också på de här adresserna på er domän:

/robots.txt/sitemap.xml/llms.txt/llms-full.txt/ai.json/.well-known/ai.json/ai-info

Exempel

Vad klarar webbplatsen och vad är påslaget?
curl https://your-site.example/umbraco/citationlab/v1/capabilities \
  -H "Authorization: Bearer cl_um_YOUR_API_KEY"
Sida 2 av publicerat engelskt innehåll, 50 per sida
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"
Pagineringsramen
{
  "items": [ … ],
  "total": 412,
  "page": 2,
  "perPage": 50,
  "totalPages": 9
}
Uppdatera SEO-fälten på en sida
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

Paketet kan skicka en signerad avisering till en HTTPS-endpoint ni väljer när innehåll eller media ändras: er egen tjänst eller ett automationsverktyg som Zapier, Make eller n8n.

  1. 1

    Slå på brytaren webhooks

    Funktionen webhooks är avstängd som standard.

  2. 2

    Ange mottagaren

    PUT settings/webhook med url (http eller https) och secret. GET settings/webhook visar url och hasSecret, aldrig själva hemligheten.

  3. 3

    Skicka ett test

    POST settings/webhook/test levererar en signerad testhändelse så att du kan kontrollera mottagaren före en riktig ändring.

Inget skickas förrän brytaren är påslagen och både url och secret är angivna. Kopplingen till Manager pekar redan webhooken mot CitationLab Manager med en egen hemlighet, så det räcker att slå på brytaren för att Manager ska se en publicerad ändring inom några sekunder. Anger ni en egen mottagare låter Manager den vara.

Ange mottagaren
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" }'

Händelser

Händelser
HändelseSkickas när
content.savedEn innehållsnod sparas.
content.publishedEn innehållsnod publiceras.
content.unpublishedEn innehållsnod avpubliceras.
content.trashedEn innehållsnod flyttas till papperskorgen.
content.deletedEn innehållsnod raderas permanent.
media.savedEn mediefil sparas.
media.deletedEn mediefil raderas.

Så ser en leverans ut

En JSON-POST med event, siteUrl, timestamp (Unix-sekunder) och data. Fält som är null utelämnas. X-CL-Event upprepar händelsenamnet och X-CL-Signature bär signaturen.

Exempel på leverans
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", … }
}

Verifiera signaturen

X-CL-Signature är HMAC-SHA256 av den exakta, råa förfrågningskroppen med er hemlighet som nyckel, som hexadecimal med gemener. Beräkna den över de råa byten innan du tolkar JSON:en och jämför med en funktion som tar konstant tid. Om du serialiserar den tolkade kroppen igen ändras byten och kontrollen misslyckas.

Node.js (Express)
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);
});
C# (ASP.NET Core minimal API)
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();
});

Leverans och nya försök

  • Leveranser köas och skickas utanför sparningen. Att spara i backoffice väntar aldrig på er mottagare.
  • Alla statuskoder under 400 räknas som levererade.
  • Efter nätverksfel, timeout, 5xx, 408 eller 429 försöker paketet två gånger till: efter 1 sekund och efter 3 sekunder. Andra 4xx-svar försöks inte igen.
  • När alla tre försöken misslyckas ger paketet upp och skriver en [citationlab]-varning i Umbraco-loggen. Använd händelsen som en signal att hämta aktuellt läge från API:et, inte som den enda kopian av ändringen.

Säkerhet och integritet

  • Koppling kräver inloggning i backoffice

    Bara en administratör som är inloggad i er backoffice kan koppla en webbplats. En URL ensam kopplar ingenting.

  • Var nyckeln finns

    På webbplatsen sparas nyckeln i App_Data/CitationLab/apikey.json. Behandla filen som ett lösenord och håll App_Data utanför versionshanteringen. Manager sparar sin kopia krypterad.

  • Avstängt tills du slår på

    Bara läsning är påslagen efter installation. Sidutdata, förfrågningar, besöksdata och integrationer kräver var sin medveten brytare.

  • Inga råa IP-adresser

    När spårning är påslagen sparar paketet aldrig en besökares råa IP-adress.

  • Varje ändring loggas

    Paketet har en egen granskningslogg över varje ändring som görs via det, med föregående värde, och en ändring kan rullas tillbaka. Ändringar från Manager loggas även i Manager.

  • Hemligheter stannar kvar

    Webhook-hemligheten kan bara skrivas via API:et: läsningar returnerar hasSecret, aldrig värdet.

Felsökning

Felsökning
Det du serVad du gör
Pairing token not foundKopiera token igen från Manager eller skapa en ny. Har du angett CitationLab:ManagerUrl måste token komma från den Managern.
Pairing token already usedEn token fungerar en gång. Skapa en ny.
Pairing token expiredEn token gäller i 15 minuter. Skapa en ny och koppla direkt.
Could not reach CitationLab Manager: …Webbservern kan inte göra utgående HTTPS-anrop till manager.citationlab.ai. Tillåt det i brandväggen eller proxyn och försök igen.
Ingen CitationLab-dashboard i sektionen ContentDin användare är inte med i admin-gruppen, eller så kör webbplatsen Umbraco 14 eller senare, som dashboarden inte stöder än.
403 med koden feature_disabledRutten hör till en avstängd funktion. details.feature anger vilken. Slå på den under Features i dashboarden.
Manager visar localhost eller en intern adressWebbplatsen kopplades från den adressen. Koppla igen från backoffice på det publika värdnamnet; det ersätter den sparade URL:en.
Webhooks kommer aldrig framKontrollera att brytaren webhooks är påslagen och att både url och secret är angivna, och skicka POST settings/webhook/test. Misslyckade leveranser loggas med [citationlab].

Vanliga frågor

Förvaltar du Umbraco åt en kund?

Berätta om webbplatsen och vad Manager ska ta hand om, så hjälper vi dig med koppling och inställningar.

Var detta till hjälp?