
# Knowledge Base-API

Din kunskapsdatabas är det som AI:n läser ifrån. Den består av två delar, och den här sidan täcker båda:

- **Kunskapskällor** (`/kb-sources`) — webbsidorna och uppladdade dokument som du matar plattformen med. Varje källa läses, delas upp i sektioner och omvandlas till FAQ:er som din AI kan svara utifrån.
- **Kunskapsgrupper** (`/kb-groups`) — namngivna paket med FAQ:er som du kan applicera på en agent eller en kampanj i ett enda anrop, så att en kunskapsmassa du redan har sammanställt kan återanvändas för nästa agent du skapar.

De FAQ:er som en källa genererar hamnar i samma bibliotek som de du skriver för hand, så när en import är klar kan du läsa, redigera och länka dem med [FAQs API](faqs.md).

Alla slutpunkter nedan är relativa till bas-URL:en `https://api.youraiconnector.com/v1`. Varje anrop måste autentiseras — se [API-åtkomst](../integrations/api-access.md) och [Autentisering](authentication.md). API-åtkomst är en betalfunktion; utan den avvisas anrop med ett `403`.


> **Import kostar krediter.** Att läsa en sida eller ett dokument och skriva FAQ:er från det förbrukar krediter, ungefär i proportion till hur mycket innehåll det finns. Använd [Beräkna en import](#estimate-what-an-import-will-cost) innan du påbörjar en stor genomsökning.

---

## Hur en import fungerar

Import är ett bakgrundsjobb, inte något som blir klart medan du väntar. Varje importslutpunkt svarar omedelbart med ett `source_id`, och du pollar källan tills den är klar:

1. **Starta importen** — `POST /kb-sources/url` (en sida), `POST /kb-sources/file` (ett uppladdat dokument) eller `POST /kb-sources/bulk-import` (upp till 100 sidor). Du får tillbaka ett käll-ID och `status: "queued"`.
2. **Polla** — `GET /kb-sources/{sourceId}` tills `status` inte längre är `queued` eller `processing`.
3. **Läs FAQ:erna** — när statusen är `ready` finns posterna som skapades i ditt FAQ-bibliotek: `GET /faqs`.

Varje källa rapporterar en av dessa statusar:

| Status | Vad det betyder |
|---|---|
| `queued` | Väntar på att bli läst. Inget har debiterats ännu. |
| `processing` | Läses och omvandlas till FAQ:er just nu. |
| `ready` | Slutförd. Dess FAQ:er finns i ditt bibliotek. |
| `failed` | Kunde inte importeras. `error_message` anger varför. |
| `cancelled` | Stoppad innan den lästes (se [Stoppa en import](#stop-an-import)). |
| `paused` | Stoppad eftersom din egen AI-nyckel misslyckades mitt under importen (se [Återuppta en pausad import](#resume-a-paused-import)). |
| `deleting` | En massborttagning pågår för källan. |
| `unknown` | Posten har ingen status. Betrakta den som ej redo. |

> **Koppla medan du importerar.** Skicka med `autoLinkToAgentId` på valfri importslutpunkt så hamnar källan — plus varje FAQ den genererar — i agentens kunskapsdatabas i samma anrop, utan behov av ett efterföljande länkningssteg. `autoLinkToCampaignId` gör detsamma för en klassisk kampanj. Länkning sker så gott det går: ett ID som inte finns, eller som tillhör ett annat konto, hoppas över tyst och importen fortsätter, så bekräfta länkningen genom att läsa tillbaka agenten.

---

## Importera en webbsida

`POST /kb-sources/url`

Lägger till en webbsida i din kunskapsdatabas.

**Begäransfält**

| Fält | Obligatoriskt | Beskrivning |
|---|---|---|
| `url` | Ja | Fullständig `http`- eller `https`-adress till sidan. |
| `autoLinkToAgentId` | Nej | ID för en AI-agent att koppla den importerade källan till. |
| `autoLinkToCampaignId` | Nej | Äldre. ID för en kampanj att koppla den importerade källan till. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/url?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/pricing",
    "autoLinkToAgentId": "ag7HkQ2ZpLxR3mNb"
  }'
```

**JavaScript**

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/kb-sources/url", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    url: "https://example.com/pricing",
    autoLinkToAgentId: "ag7HkQ2ZpLxR3mNb",
  }),
});
const { source_id } = await res.json();
```

**Python**

```python
import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/kb-sources/url",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "url": "https://example.com/pricing",
        "autoLinkToAgentId": "ag7HkQ2ZpLxR3mNb",
    },
)
source_id = res.json().get("source_id")
```

**Svar** — `202 Accepted`

```json
{
  "success": true,
  "source_id": "kb_src_abc123",
  "status": "queued",
  "batch_id": "batch_9f2a"
}
```

Fråga `source_id` med [Kontrollera en källa](#check-a-source) tills statusen är `ready` eller `failed`.

Om samma sida redan finns i din kunskapsbas köas inget nytt och du får en `200` istället — och om du bad om en automatisk länk, länkas den befintliga källan åt dig ändå:

```json
{
  "success": true,
  "status": "exists",
  "skipped_duplicate": 1
}
```

En saknad `url`, eller en som inte är en giltig `http`/`https`-adress, returnerar `400`.

---

## Importera ett uppladdat dokument

`POST /kb-sources/file`

Lägger till ett dokument som **redan finns i ditt kontos fillagring** som en kunskapskälla. Stödda typer: PDF, DOCX, TXT, MD, CSV och XLSX.

> **Denna slutpunkt hanterar inte själva filen.** Det finns ingen multipart-uppladdning, ingen base64-body och ingen nedladdning från en URL: du skickar lagringsplatsen för en fil som redan existerar, och den måste ligga under din egen uppladdningsmapp (`storage_path` måste börja med `users/{your user id}/uploads/`), annars nekas förfrågan med `403`. Instrumentpanelen placerar filer där när du drar in dem. Om du inte har något sätt att placera en fil där, importera en webbsida med [Importera en webbsida](#import-a-web-page) istället.

**Begäransfält**

| Fält | Obligatoriskt | Beskrivning |
|---|---|---|
| `storage_path` | Ja | Var den uppladdade filen finns. Måste börja med `users/{your user id}/uploads/`. |
| `filename` | Ja | Ursprungligt filnamn inklusive dess filändelse — det är så filtypen detekteras. |
| `mime_type` | Ja | MIME-typ för filen, till exempel `application/pdf`. |
| `autoLinkToAgentId` | Nej | ID för en AI-agent att koppla dokumentet till. |
| `autoLinkToCampaignId` | Nej | Äldre. ID för en kampanj att koppla dokumentet till. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/file?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "storage_path": "users/abc123uid/uploads/handbook.pdf",
    "filename": "handbook.pdf",
    "mime_type": "application/pdf",
    "autoLinkToAgentId": "ag7HkQ2ZpLxR3mNb"
  }'
```

**Svar** — `202 Accepted`

```json
{
  "success": true,
  "source_id": "kb_src_abc123",
  "status": "queued"
}
```

| Status | När |
|---|---|
| `400` | Ett obligatoriskt fält saknas, eller så är filen av en typ vi inte kan läsa. |
| `403` | `storage_path` ligger utanför din egen uppladdningsmapp. |

---

## Kontrollera en källa

`GET /kb-sources/{sourceId}`

Frågan som följer varje import och uppdatering. Upprepa den tills statusen är `ready` eller `failed`.

**cURL**

```bash
curl "https://api.youraiconnector.com/v1/kb-sources/kb_src_abc123?apiKey=YOUR_API_KEY"
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/kb-sources/kb_src_abc123",
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const source = await res.json();
```

**Python**

```python
import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/kb-sources/kb_src_abc123",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
source = res.json()
```

**Svar**

```json
{
  "success": true,
  "source_id": "kb_src_abc123",
  "status": "ready",
  "faq_count": 24,
  "section_count": 31,
  "error_message": null
}
```

| Fält | Typ | Beskrivning |
|---|---|---|
| `status` | string | Var källan befinner sig i pipelinen (se [statustabellen](#how-an-import-works)). |
| `faq_count` | integer | Hur många FAQ:er som har genererats från denna källa hittills. |
| `section_count` | integer | I hur många innehållssektioner källan delades upp. |
| `error_message` | string \| null | Varför importen misslyckades, när statusen är `failed`. `null` annars. |

---

## Ta bort en källa

`DELETE /kb-sources/{sourceId}`

Tar bort en kunskapskälla. **Som standard behålls de FAQ:er som skapades** — lägg till `delete_faqs=true` för att även ta bort dessa.

**Frågeparametrar**

| Parameter | Krävs | Beskrivning |
|---|---|---|
| `delete_faqs` | Nej | Sätt till `true` för att även ta bort varje FAQ som denna källa skapade. Standardvärdet är `false`. |

**cURL**

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/kb-sources/kb_src_abc123?delete_faqs=true&apiKey=YOUR_API_KEY"
```

**Svar**

```json
{
  "success": true,
  "faqs_deleted": 24
}
```

`faqs_deleted` är `0` såvida du inte bad om `delete_faqs=true`.

---

## Importera många sidor samtidigt

`POST /kb-sources/bulk-import`

Lägger till upp till 100 webbsidor i ett anrop — den vanliga uppföljningen till [Upptäck sidor på en webbplats](#discover-pages-on-a-website) eller [Hitta nya sidor på en webbplats](#find-new-pages-on-a-website). Sidor som redan finns i din kunskapsbas hoppas över istället för att dupliceras (och är fortfarande länkade till agenten när du bad om det).

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `urls` | Ja | Adresser att importera. Minst 1, högst 100 per anrop. |
| `autoLinkToAgentId` | Nej | ID för en AI-agent att koppla varje importerad sida till. |
| `autoLinkToCampaignId` | Nej | Äldre. ID för en kampanj att koppla varje importerad sida till. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/bulk-import?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "urls": ["https://example.com/pricing", "https://example.com/faq"],
    "autoLinkToAgentId": "ag7HkQ2ZpLxR3mNb"
  }'
```

**JavaScript**

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/kb-sources/bulk-import", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    urls: ["https://example.com/pricing", "https://example.com/faq"],
    autoLinkToAgentId: "ag7HkQ2ZpLxR3mNb",
  }),
});
const { queued_source_ids } = await res.json();
```

**Python**

```python
import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/kb-sources/bulk-import",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "urls": ["https://example.com/pricing", "https://example.com/faq"],
        "autoLinkToAgentId": "ag7HkQ2ZpLxR3mNb",
    },
)
queued_source_ids = res.json()["queued_source_ids"]
```

**Svar** — `202 Accepted`

```json
{
  "success": true,
  "batch_id": "batch_9f2a",
  "queued": 2,
  "skipped_duplicate": 0,
  "queued_source_ids": ["kb_src_abc123", "kb_src_def456"]
}
```

Fråga varje ID i `queued_source_ids` med [Kontrollera en källa](#check-a-source). Om du skickar en tom `urls`-array, en post som inte är en sträng eller fler än 100 poster returneras `400`.

---

## Ta bort många källor samtidigt

`POST /kb-sources/bulk-delete`

Tar bort upp till 2 000 kunskapskällor i ett anrop. Borttagningen körs i bakgrunden och du får ett e-postmeddelande när den är klar.

> **Massradering tar alltid bort även vanliga frågor (FAQ).** Till skillnad från [Ta bort en källa](#delete-a-source), som behåller dem om du inte ber om annat, tar denna slutpunkt bort varje källa tillsammans med de vanliga frågor som den skapade. Det finns inget alternativ att behålla dem.

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `sourceIds` | Ja | ID:n för källorna som ska tas bort. Minst 1, högst 2 000 per anrop. |
| `domainLabel` | Nej | Ett vänligt namn för denna rensning. Används endast i bekräftelsemailet. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/bulk-delete?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sourceIds": ["kb_src_abc123", "kb_src_def456"],
    "domainLabel": "example.com"
  }'
```

**Svar** — `202 Accepted`

```json
{
  "success": true,
  "batch_id": "del_batch_31a",
  "queued": 2
}
```

---

## Upptäck sidor på en webbplats

`POST /kb-sources/discover-pages`

Utforskar en webbplats från en startadress och listar sidorna som hittats på samma domän, var och en med en bedömning av om det är värt att importera dem. **Ingenting importeras och ingenting väljs åt dig** — detta är steget "vad finns på den här webbplatsen" som du kör innan du bestämmer vad som ska skickas till [Importera många sidor samtidigt](#import-many-pages-at-once).

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `url` | Ja | Adress att börja utforska från, vanligtvis webbplatsens startsida. |
| `maxPages` | Nej | Övre gräns för hur många sidor som ska returneras. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/discover-pages?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://example.com", "maxPages": 100 }'
```

**Svar**

```json
{
  "success": true,
  "source_type": "sitemap",
  "pages": [
    {
      "url": "https://example.com/pricing",
      "title": "Pricing",
      "depth": 1,
      "score": 95,
      "recommendation": "add",
      "reason_key": "core_page"
    }
  ]
}
```

| Fält | Typ | Beskrivning |
|---|---|---|
| `source_type` | string | Hur sidorna hittades — `sitemap` (webbplatsens egen sitemap) eller `link_discovery` (genom att följa länkar). |
| `url` | string | Fullständig adress till sidan. |
| `title` | string \| null | Sidtitel, när en sådan kunde läsas. |
| `depth` | integer | Hur många länkar bort från startsidan denna sida hittades. |
| `score` | integer | Hur användbar sidan ser ut som kunskap, från `0` till `100`. |
| `recommendation` | string | `add` (helt klart värt att importera, poäng 90 eller högre), `maybe` (gränsfall), eller `skip` (innehåll som sällan hjälper en assistent — ändringsloggar, juridiska sidor, dubblettöversättningar). |
| `reason_key` | string | En stabil, maskinläsbar orsak bakom rekommendationen, till exempel `core_page`, `changelog_history`, `legal_page` eller `locale_duplicate`. |

> **Utforskning sker så gott det går.** Om webbplatsen inte kan läsas är svaret fortfarande `200`, med `success: false`, en tom `pages`-lista och ett `error`-meddelande. Kontrollera `success` innan du läser `pages`.

En saknad `url` returnerar `400`.

---

## Uppskatta vad en import kommer att kosta

`POST /kb-sources/estimate-cost`

Beräknar hur många krediter en föreslagen import skulle förbruka, innan du genomför den. Sidor hämtas och dokument läses för att mäta deras storlek, men ingenting importeras och själva uppskattningen förbrukar inga krediter.

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `urls` | Nej | Sid-adresser som du överväger att importera. |
| `files` | Nej | Redan uppladdade filer som du överväger. Varje post behöver `storage_path`, `filename` och `mime_type`. |
| `tier` | Nej | AI-kvalitetsnivån som importen kommer att köras på, så att uppskattningen matchar vad du faktiskt kommer att debiteras. Lämna tomt för standardtaxan. |

Skicka `urls`, `files`, eller båda.

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/estimate-cost?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "urls": ["https://example.com/pricing"] }'
```

**Svar**

```json
{
  "success": true,
  "estimates": [
    { "ref": "https://example.com/pricing", "chunks": 7, "credits": 7 }
  ],
  "total_chunks": 7,
  "total_credits": 7
}
```

Varje rad återspeglar URL:en eller lagringssökvägen i `ref` så att du kan matcha den mot din indata. En sida eller fil som inte kunde läsas får fortfarande en rad, räknad som ett segment, med ett `error` på den.

---

## Stoppa en import

`POST /kb-sources/cancel-import`

Stoppar sidor som fortfarande väntar i importkön — knappen "stoppa import" för en genomsökning som visade sig vara större än du förväntat dig. Att avbryta en väntande sida kostar ingenting, eftersom den ännu inte har lästs.

Sidor som redan bearbetas stoppas **inte**: deras arbete pågår och debiteras oavsett, så de slutförs. Svaret rapporterar hur många sådana det rörde sig om.

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `host` | Nej | Stoppa endast väntande sidor på denna webbplats (till exempel `docs.example.com`). Lämna tomt för att stoppa varje väntande import på kontot. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/cancel-import?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "host": "docs.example.com" }'
```

**Svar**

```json
{
  "success": true,
  "cancelled": 412,
  "in_flight": 3
}
```

---

## Återuppta en pausad import

`POST /kb-sources/resume-import`

Startar om en import som pausades eftersom din egen AI-nyckel slutade fungera.

> Att anropa detta **är** ditt medgivande att slutföra importen med den nyckel som är aktiv nu — vilket kan innebära att plattformskrediter förbrukas om din egen nyckel fortfarande är nere.

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `host` | Nej | Återuppta endast pausade sidor på denna webbplats. Lämna tomt för att återuppta allt som pausats. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/resume-import?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

**Svar**

```json
{
  "success": true,
  "resumed": 58
}
```

---

## Hitta nya sidor på en webbplats

`POST /kb-sources/refresh-domain`

Utforskar en webbplats du redan har importerat från och rapporterar endast de sidor som **inte** finns i din kunskapsbas ännu, var och en med samma rekommendation som vid sidupptäckt. Ingenting importeras och ingenting ändras.

De två uppföljningarna är avsiktligt separata anrop, så att avbryta detta kostar ingenting:

- importera de nya sidor du vill ha med [Importera många sidor samtidigt](#import-many-pages-at-once);
- läs om de sidor du redan har med [Uppdatera varje sida på en webbplats](#refresh-every-page-on-a-website).

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `baseUrl` | Ja | Valfri adress på webbplatsen, eller bara värden. |
| `maxPages` | Nej | Övre gräns för hur många sidor som ska utforskas. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/refresh-domain?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "baseUrl": "https://example.com" }'
```

**Svar**

```json
{
  "success": true,
  "source_type": "sitemap",
  "discovered": 249,
  "new_pages": [
    {
      "url": "https://example.com/new-guide",
      "score": 95,
      "recommendation": "add",
      "reason_key": "core_page"
    }
  ],
  "new_urls_queued": 0,
  "existing_refresh_queued": 249
}
```

| Fält | Typ | Beskrivning |
|---|---|---|
| `discovered` | heltal | Hur många sidor som totalt hittades på webbplatsen. |
| `new_pages` | array | Sidor som ännu inte finns i din kunskapsdatabas. Ingenting köas åt dig — importera de du vill ha. |
| `new_urls_queued` | heltal | Alltid `0`. Behålls för bakåtkompatibilitet; denna slutpunkt köar aldrig någonting. |
| `existing_refresh_queued` | heltal | Hur många sidor du redan importerat från denna webbplats som hittades redo att läsas om. Ingenting köas av detta anrop. |
| `batch_id` | sträng | Finns endast när en batch skapades. |

Liksom upptäckt misslyckas detta mjukt: en webbplats som inte kan läsas returnerar fortfarande `200`, med `success: false`, en tom `new_pages` och en `error`. En saknad eller tom `baseUrl` returnerar `400`.

---

## Uppdatera varje sida på en webbplats

`POST /kb-sources/trigger-domain-refresh`

Läser om varje sida du redan har importerat från en webbplats, så att dess FAQ följer webbplatsens aktuella innehåll: ändrade avsnitt uppdateras, nya avsnitt läggs till och borttagna avsnitt tas bort.

Detta köar arbete och returnerar omedelbart. Följ upp med [Spåra en webbplatsuppdatering](#track-a-website-refresh) och stoppa den med [Stoppa en webbplatsuppdatering](#stop-a-website-refresh).

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `baseUrl` | Ja | Valfri adress på webbplatsen, eller bara värden. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/trigger-domain-refresh?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "baseUrl": "https://example.com" }'
```

**Svar**

```json
{
  "success": true,
  "queued": 249
}
```

---

## Spåra en webbplatsuppdatering

`GET /kb-sources/domain-refresh-status`

Hur långt en webbplatsuppdatering har kommit, så att du kan visa förlopp som "221 av 249".

**Frågeparametrar**

| Parameter | Krävs | Beskrivning |
|---|---|---|
| `baseUrl` | Ja | Valfri adress på webbplatsen, eller bara värden. |

**cURL**

```bash
curl "https://api.youraiconnector.com/v1/kb-sources/domain-refresh-status?baseUrl=https://example.com&apiKey=YOUR_API_KEY"
```

**Svar**

```json
{
  "success": true,
  "job": {
    "domainBatchId": "job_7c1e",
    "host": "example.com",
    "total": 249,
    "pending": 28,
    "succeeded": 219,
    "failed": 2,
    "skippedDuplicate": 0,
    "status": "refreshing",
    "startedAtIso": "2026-06-15T09:00:00.000Z"
  }
}
```

`job` är `null` när ingen uppdatering körs för den webbplatsen. Sidor som är klara hittills är `total` minus `pending`. Jobbet `status` är ett av `refreshing` (arbetar fortfarande igenom sidor), `deduplicating` (upprensningspasset i slutet), eller det slutgiltiga `completed`, `failed` och `cancelled`. Behåll `domainBatchId` — det är vad du skickar till avbrytningsslutpunkten.

En saknad eller tom `baseUrl` returnerar `400`.

---

## Stoppa en webbplatsuppdatering

`POST /kb-sources/refresh-domain/cancel`

Stoppar en webbplatsuppdatering som fortfarande bearbetar sina sidor. Sidor som redan är färdiga behåller sitt uppdaterade innehåll; sidor som inte har påbörjats tas bort, och sidor som höll på att läsas in på nytt återgår till sitt tidigare tillstånd.

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `jobId` | Ja | Det `domainBatchId` som returneras av [Spåra en webbplatsuppdatering](#track-a-website-refresh). |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/refresh-domain/cancel?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "jobId": "job_7c1e" }'
```

**Svar**

```json
{
  "success": true,
  "status": "cancelled",
  "cancelled_units": 28,
  "sources_reset": 3,
  "sources_cancelled": 25
}
```

| Fält | Typ | Beskrivning |
|---|---|---|
| `status` | string | Uppdateringens tillstånd efter detta anrop: `cancelled`, `deduplicating`, `completed` eller `failed`. |
| `cancelled_units` | integer | Hur mycket arbete som återstod när avbokningen genomfördes. `0` vid upprepad avbokning. |
| `sources_reset` | integer | Sidor som tagits bort från bearbetning och återförts till `ready`. |
| `sources_cancelled` | integer | Helt nya sidor för denna uppdatering som fortfarande låg i kö och nu har avbrutits. |

Att avbryta två gånger är ofarligt — det andra anropet rapporterar samma slutgiltiga tillstånd. När uppdateringen väl har gått vidare till sin rensningsfas kan den inte längre stoppas, och svaret kommer tillbaka med `success: false` och `reason: "already_finalizing"`. Ett saknat `jobId` returnerar `400`, och ett jobb som inte finns i ditt konto returnerar `404`.

---

## Uppdatera en enskild källa

`POST /kb-sources/{sourceId}/refresh`

Läser in en webbsida på nytt som du redan har importerat och synkroniserar dess FAQ med sidans nuvarande innehåll: ändrade avsnitt uppdateras, nya läggs till, borttagna tas bort.

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/kb_src_abc123/refresh?apiKey=YOUR_API_KEY"
```

**Svar** — `202 Accepted`

```json
{
  "success": true,
  "source_id": "kb_src_abc123",
  "status": "queued"
}
```

Avfråga källan tills dess status lämnar `queued` och `processing`. Ett käll-ID som inte finns i ditt konto returnerar `404`.

---

## Välj de mest relevanta sidorna

`POST /kb-sources/select-relevant-pages`

Ber AI:n att välja ut de fem sidor, från en lista med kandidater, som bäst beskriver en verksamhet — används vid generering av en kampanjplan från en webbplats. Detta förbrukar krediter.

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `urls` | Ja | Kandidatsidor att välja mellan, vanligtvis från sididentifiering. |
| `homeUrl` | Ja | Webbplatsens startsida, används som kontext för valet. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-sources/select-relevant-pages?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "homeUrl": "https://example.com",
    "urls": ["https://example.com/about", "https://example.com/pricing"]
  }'
```

**Svar**

```json
{
  "success": true,
  "pages": [
    { "url": "https://example.com/pricing", "title": "Pricing", "type": "pricing" }
  ]
}
```

Detta är en hjälpare, inte en resurs: vid fel svarar den fortfarande `200`, med `success: false`, en tom `pages`-lista och ett `error`-meddelande.

---

## Kunskapsgrupper

En **kunskapsgrupp** är ett namngivet paket med vanliga frågor (FAQ) — "Frakt och returer", "Onboarding" — som du kan tillämpa på en agent eller en kampanj i ett anrop. Gruppen innehåller referenser, inte kopior: själva frågorna finns kvar i ditt gemensamma bibliotek, så om du redigerar en fråga med [FAQs API](faqs.md) uppdateras den överallt där den används.

Att tillämpa en grupp **lägger bara till** det som saknas, så att tillämpa samma grupp två gånger är ofarligt och `added_count` returneras som `0` andra gången.

---

## Skapa en kunskapsgrupp

`POST /kb-groups`

Skapar en grupp. Den börjar som tom — lägg till frågor i den med [Lägg till en FAQ i en grupp](#add-a-faq-to-a-group).

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `name` | Ja | Gruppens namn. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-groups?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Shipping and returns" }'
```

**JavaScript**

```javascript
const res = await fetch("https://api.youraiconnector.com/v1/kb-groups", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ name: "Shipping and returns" }),
});
const { group_id } = await res.json();
```

**Python**

```python
import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/kb-groups",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"name": "Shipping and returns"},
)
group_id = res.json()["group_id"]
```

**Svar** — `201 Created`

```json
{
  "success": true,
  "group_id": "kbg_abc123"
}
```

---

## Byt namn på en kunskapsgrupp

`PUT /kb-groups/{groupId}`

Ändrar namnet på en grupp. Dess frågor förblir orörda.

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `name` | Ja | Gruppens nya namn. |

**cURL**

```bash
curl -X PUT "https://api.youraiconnector.com/v1/kb-groups/kbg_abc123?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Shipping, returns and refunds" }'
```

**Svar**

```json
{
  "success": true,
  "group_id": "kbg_abc123",
  "name": "Shipping, returns and refunds"
}
```

---

## Ta bort en kunskapsgrupp

`DELETE /kb-groups/{groupId}`

Tar bort gruppen. Endast paketet tas bort — frågorna i det finns kvar i ditt bibliotek, och allt som gruppen redan var tillämpad på behåller dessa frågor.

**cURL**

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/kb-groups/kbg_abc123?apiKey=YOUR_API_KEY"
```

**Svar**

```json
{
  "success": true
}
```

---

## Lägg till en FAQ i en grupp

`POST /kb-groups/{groupId}/faqs`

Placerar en befintlig FAQ i en grupp. Detta ändrar endast paketet — det kopplar inte i sig själv FAQ:n till någon Agent; använd gruppen för det.

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `faq_id` | Ja | ID för FAQ:n som ska läggas till. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-groups/kbg_abc123/faqs?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "faq_id": "aBcD1234eFgH5678" }'
```

**Svar**

```json
{
  "success": true,
  "group_id": "kbg_abc123",
  "faq_id": "aBcD1234eFgH5678"
}
```

---

## Ta bort en FAQ från en grupp

`DELETE /kb-groups/{groupId}/faqs/{faqId}`

Tar bort en FAQ från en grupp. Själva FAQ:n raderas inte, och agenter som gruppen redan var tillämpad på behåller den.

**cURL**

```bash
curl -X DELETE "https://api.youraiconnector.com/v1/kb-groups/kbg_abc123/faqs/aBcD1234eFgH5678?apiKey=YOUR_API_KEY"
```

**Svar**

```json
{
  "success": true,
  "group_id": "kbg_abc123",
  "faq_id": "aBcD1234eFgH5678"
}
```

---

## Tillämpa en grupp på en agent

`POST /kb-groups/{groupId}/apply-to-agent`

Lägger till varje FAQ i gruppen till en AI-agents kunskap i ett anrop — det snabba sättet att ge en ny agent en kunskapsbas som du redan har sammanställt.

**Begäransfält**

| Fält | Krävs | Beskrivning |
|---|---|---|
| `agent_id` | Ja | ID för AI-agenten som gruppen ska tillämpas på. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-groups/kbg_abc123/apply-to-agent?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "agent_id": "ag7HkQ2ZpLxR3mNb" }'
```

**JavaScript**

```javascript
const res = await fetch(
  "https://api.youraiconnector.com/v1/kb-groups/kbg_abc123/apply-to-agent",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ agent_id: "ag7HkQ2ZpLxR3mNb" }),
  }
);
const { added_count } = await res.json();
```

**Python**

```python
import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/kb-groups/kbg_abc123/apply-to-agent",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"agent_id": "ag7HkQ2ZpLxR3mNb"},
)
added_count = res.json()["added_count"]
```

**Svar**

```json
{
  "success": true,
  "group_id": "kbg_abc123",
  "agent_id": "ag7HkQ2ZpLxR3mNb",
  "added_count": 12
}
```

`added_count` är hur många FAQ:er som faktiskt lades till — `0` när gruppen är tom eller redan tillämpad.

---

## Tillämpa en grupp på en kampanj

`POST /kb-groups/{groupId}/apply-to-campaign`

Den klassiska kampanjversionen av anropet ovan. På ett agentbaserat konto, använd [Tillämpa en grupp på en agent](#apply-a-group-to-an-agent) istället.

**Begäransfält**

| Fält | Obligatoriskt | Beskrivning |
|---|---|---|
| `campaign_id` | Ja | ID för kampanjen som gruppen ska tillämpas på. |

**cURL**

```bash
curl -X POST "https://api.youraiconnector.com/v1/kb-groups/kbg_abc123/apply-to-campaign?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "campaign_id": "campaign123" }'
```

**Svar**

```json
{
  "success": true,
  "group_id": "kbg_abc123",
  "campaign_id": "campaign123",
  "added_count": 12
}
```

---

## Fel i Knowledge Base-API:et

Dessa slutpunkter returnerar standardfelmeddelandet:

```json
{
  "success": false,
  "error": "Knowledge base source not found."
}
```

| Status | När det inträffar på en Knowledge Base-slutpunkt |
|---|---|
| `400` | Ett obligatoriskt fält saknas eller är ogiltigt — ett tomt `url`, ett saknat `baseUrl` eller `jobId`, fler än 100 webbadresser vid massimport, fler än 2 000 ID:n vid massradering, eller en filtyp vi inte kan läsa. |
| `402` | Inte tillräckligt med krediter för att köra importen. Fyll på och försök igen. |
| `403` | En `storage_path` utanför din egen uppladdningsmapp — eller så inkluderar din plan inte API-åtkomst. |
| `404` | Källan, gruppen, FAQ:n, agenten, kampanjen eller uppdateringsjobbet hittades inte — antingen existerar det inte eller så tillhör det ett annat konto. |

> **Mjukvarufel är inte fel.** Upptäckt (`discover-pages`, `refresh-domain`) och hjälpen för sidval svarar `200` med `success: false` och ett `error`-meddelande när webbplatsen inte kan läsas, istället för att misslyckas med begäran. Kontrollera alltid `success` innan du läser datan.

De delade koderna som alla slutpunkter kan returnera — `401`, `403` (din plan inkluderar inte API-åtkomst), `429` (hastighetsbegränsning) och `500` — listas med vägledning för återförsök i [Fel & Paginering](errors-and-pagination.md).

---

## Relaterat

- [FAQs API](faqs.md) — läs, redigera och länka de FAQ:er som dina källor skapar.
- [Hantera FAQ:er](../ai-automation/faq-management.md) — samma kunskapsdatabas i instrumentpanelen.
- [AI-agenter](../ai-agents/ai-agents.md) — agenterna som du kopplar källor och grupper till.
- [API-åtkomst](../integrations/api-access.md) — generera din API-nyckel.
- [Autentisering](authentication.md) — alla sätt att skicka med din nyckel.
