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.UmbracoKrav
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
Lägg till paketet
Kör dotnet add package CitationLab.Umbraco från mappen för ert Umbraco-webbprojekt.
- 2
Bygg om
Bygg lösningen som ni brukar och driftsätt den.
- 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.
{
"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
Skapa en kopplingstoken i Manager
Öppna projektet i AI Marketing Manager, gå till Integrations → Umbraco → Connect och välj “Generate pairing token”.
- 2
Öppna CitationLab-dashboarden
Logga in i Umbracos backoffice som administratör, öppna sektionen Content och välj dashboarden “CitationLab”.
- 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.
| Grupp | Standard | Vad den omfattar | Brytare |
|---|---|---|---|
| Synk | På | 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 |
| Sidutdata | Av | Det 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ågningar | Av | Omdirigeringar, logg över 404-fel, länkskanner och integritetskontroll. | redirectsmonitor_404link_scannerintegrity_checker |
| Besöksdata | Av | Spå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 |
| Integrationer | Av | Umbraco 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.
| Kod | HTTP | Betydelse |
|---|---|---|
invalid_request | 400 | Förfrågan är felaktigt formad, en parameter har fel värde eller en obligatorisk kropp saknas. |
feature_disabled | 403 | Funktionen bakom rutten är avstängd. details.feature anger vilken brytare det gäller. |
not_found | 404 | Noden, mediefilen eller posten finns inte. |
operation_failed | 500 | Umbraco kunde inte slutföra åtgärden. Webbplatsens logg har detaljerna. |
unsupported | 501 | Webbplatsen kan inte göra detta, till exempel för att ett nödvändigt Umbraco-tillägg inte är installerat. |
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
| Metod | Sökväg | Vad den gör |
|---|---|---|
| GET | health | Kör paketet? Öppen, ingen nyckel. |
| GET | version | Installerad paketversion. |
| GET | site-info | Webbplatsens namn, URL och Umbraco-version. |
| GET | capabilities | Vad installationen klarar och vad som är påslaget. |
| GET | features | Funktionsbrytarna som de står nu. |
| PUT | features | Slå av eller på funktioner. |
Innehåll
| Metod | Sökväg | Vad den gör |
|---|---|---|
| GET | content | Paginerad lista. Filter: status (published, draft, trashed), document_type_alias, search, culture, parent_id, order_by, direction, include_properties. |
| POST | content | Skapa en nod. |
| GET · PUT · DELETE | content/{id} | Läs, uppdatera eller radera en nod. |
| GET | content/by-path | Hitta en nod utifrån URL-sökvägen. |
| GET | content/{id}/children | Nodens barn. |
| POST | content/{id}/publish | Publicera. |
| POST | content/{id}/unpublish | Avpublicera. |
| POST | content/{id}/move | Flytta till en annan förälder. |
| POST | content/{id}/copy | Kopiera. |
| GET | content/{id}/preview-url | En förhandsvisningslänk för opublicerade ändringar. |
| GET | content/{id}/tags | Nodens taggar. |
Versioner, schemaläggning och språk
| Metod | Sökväg | Vad den gör |
|---|---|---|
| GET | content/{id}/versions | Versionshistorik. |
| GET | content/{id}/versions/{versionId} | En tidigare version. |
| POST | content/{id}/versions/{versionId}/restore | Återställ till den versionen. |
| GET · PUT | content/{id}/schedule | Schemalagda datum för publicering och avpublicering. |
| GET | languages | Webbplatsens språk. |
| GET | content/{id}/translations | Vilka språk en nod finns på. |
| POST | content/{id}/translations/{culture}/publish | Publicera bara ett språk. |
Massåtgärder, sök och dokumenttyper
| Metod | Sökväg | Vad den gör |
|---|---|---|
| POST | bulk/content/status | Publicera eller avpublicera många noder. |
| POST | bulk/content/update | Uppdatera många noder. |
| POST | bulk/content/delete | Radera många noder. |
| POST | bulk/seo-meta | Sätt SEO-fält på många noder. |
| GET | search | Sök i webbplatsens eget Examine-index, sorterat efter relevans. |
| GET | search/indexes | Tillgängliga Examine-index. |
| GET | document-types | Alla dokumenttyper. |
| GET | document-types/{alias} | En dokumenttyp med dess egenskaper. |
SEO, strukturerad data och AI-filer
| Metod | Sökväg | Vad den gör |
|---|---|---|
| GET · PUT | seo-meta/{id} | Titel, beskrivning, fokusord, canonical och robots-inställningar för en nod. |
| GET · PUT | content/{id}/og | Fält för Open Graph och delningskort. |
| GET · PUT | llms | Webbplatsens llms.txt. |
| POST | llms/generate | Föreslå en llms.txt utifrån webbplatsens struktur. Förslaget returneras och sparas inte. |
| GET · PUT | aeo | Instä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
| Metod | Sökväg | Vad den gör |
|---|---|---|
| GET · POST | redirects | Lista eller skapa omdirigeringar. |
| GET · PUT · DELETE | redirects/{id} | Läs, ändra eller ta bort en omdirigering. |
| POST | redirects/import | Importera omdirigeringar. |
| GET | redirects/export | Exportera omdirigeringar. |
| GET | 404-log | Loggade 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
| Metod | Sökväg | Vad den gör |
|---|---|---|
| GET · POST | media | Lista eller ladda upp media. |
| GET · PUT · DELETE | media/{id} | Läs, ändra eller radera en mediefil. |
| POST | media/{id}/file | Byt ut filen. |
| GET | media/{id}/usage | Var filen används. |
| POST | media/folder | Skapa en mediemapp. |
| GET | media-types | Webbplatsens medietyper. |
Ingår också i gruppen: alt-text/scan alt-text/stats alt-text/bulk-update
Drift
| Metod | Sökväg | Vad den gör |
|---|---|---|
| GET | audit-log | Varje ändring som gjorts via paketet, med föregående värde. |
| POST | audit-log/{id}/restore | Sätt tillbaka föregående värde. |
| GET · PUT | settings/webhook | Mottagar-URL och hemlighet för webhooks. Hemligheten returneras aldrig. |
| POST | settings/webhook/test | Skicka 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
| Metod | Sökväg | Vad den gör |
|---|---|---|
| GET | dictionary | Ordlisteposter i Umbraco. |
| PUT | dictionary/{key} | Ändra en ordlistepost. |
| GET | members | Umbraco-medlemmar. |
| GET | forms | Umbraco Forms, när det är installerat. |
| GET | commerce/products | Produkter i Umbraco Commerce, när det är installerat. |
| GET | commerce/orders | Ordrar 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
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
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
Slå på brytaren webhooks
Funktionen webhooks är avstängd som standard.
- 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
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.
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ändelse | Skickas när |
|---|---|
content.saved | En innehållsnod sparas. |
content.published | En innehållsnod publiceras. |
content.unpublished | En innehållsnod avpubliceras. |
content.trashed | En innehållsnod flyttas till papperskorgen. |
content.deleted | En innehållsnod raderas permanent. |
media.saved | En mediefil sparas. |
media.deleted | En 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.
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.
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();
});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
| Det du ser | Vad du gör |
|---|---|
| Pairing token not found | Kopiera 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 used | En token fungerar en gång. Skapa en ny. |
| Pairing token expired | En 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 Content | Din 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_disabled | Rutten hör till en avstängd funktion. details.feature anger vilken. Slå på den under Features i dashboarden. |
| Manager visar localhost eller en intern adress | Webbplatsen 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 fram | Kontrollera 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
Nej. Efter installation läser paketet bara innehåll så att Manager kan synka det. Inget skrivs in i sidorna, inga förfrågningar omdirigeras och ingen besöksdata samlas in förrän en administratör slår på de funktionerna.
Umbraco 13 LTS på .NET 8. Umbraco 14 och senare stöds inte än, eftersom modellen för backoffice-tillägg har ändrats och dashboarden måste skrivas om. API-delen påverkas inte av den ändringen.
I 15 minuter, och den kan användas en gång. Har den gått ut eller använts skapar du en ny i Manager under Integrations → Umbraco.
Ja. API:et körs på er egen webbplats och godtar nyckeln som webbplatsen fick vid kopplingen, skickad som bearer-token. Nyckeln finns på servern i App_Data/CitationLab/apikey.json.
Ja. All läsning och skrivning av innehåll tar en valfri culture, och du kan publicera ett språk för sig.
Kopplar du bort i dashboarden tas nyckeln som är sparad på webbplatsen bort. Tar du bort kopplingen i Manager raderas kopplingen och Managers cachade innehåll; själva Umbraco-webbplatsen ändras inte.
Ja. Peka dem mot valfri HTTPS-endpoint som ni kontrollerar, till exempel en egen tjänst, Zapier, Make eller n8n, och verifiera headern X-CL-Signature med er hemlighet.
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?

