# Så fyller du en coreAI-assistent med data via API:et

coreAI-API:et är gjort för system som vill skicka egen data direkt in i en assistent och använda den som svarsunderlag i chatt eller sökning. Integrationen handlar först om att hålla kunskapsbasen uppdaterad, därefter om att välja hur användarna ska möta assistenten: via coreAI-widgeten, ett eget chattgränssnitt eller en ren sökning.

## Börja med assistent, källa och token

Alla anrop mot API v2 går mot `https://portal.coreai.no/api/v2` i produktion eller `https://stage.coreai.no/api/v2` i testmiljön. API:et använder en Bearer-token, och de viktigaste sökvägarna behöver både `assistantId` och `contentImporterId`.

`assistantId` pekar på assistenten som ska svara. `contentImporterId` pekar på API-källan där datan lagras. När du läser entiteter tillbaka med externt ID söker coreAI i den angivna källan.

## Upsert är huvudvägen för att fylla assistenten

För en löpande integration bör ditt system skicka en `POST` till `/assistants/{assistantId}/sources/{contentImporterId}` varje gång ett objekt skapas eller ändras. Upsert ersätter hela entiteten: första anropet skapar den, senare anrop uppdaterar samma `id`. Du behöver alltså inte göra extra anrop för att kontrollera om entiteten redan finns – upsert löser det åt dig.

```json
{
  "data": [
    {
      "id": "product-123",
      "type": "products",
      "lastModifiedAt": "2026-04-28T12:00:00Z",
      "attributes": {
        "productNumber": "123",
        "name": "Fjälljacka",
        "description": "Lätt skaljacka för skiftande väder.",
        "url": "https://example.com/products/123",
        "price": 1299,
        "inStock": true
      }
    }
  ]
}
```

Entitetstyperna täcker de vanligaste datakällorna en assistent behöver: `products`, `contents`, `documents`, `events`, `contacts`, `job_postings` och `educations`. Varje typ har sina egna obligatoriska fält. Produkter behöver till exempel `name` och `productNumber`, medan innehåll behöver `name` och `longDescription`.

## Använd PATCH när bara delar av entiteten ändras

`PATCH` mot samma endpoint låter dig skicka enbart de fält som har ändrats. Det passar när ett externt system publicerar små statusändringar, till exempel pris, lagerstatus eller datum.

## Borttagning av entiteter

`DELETE` tar en enkel lista med `id` och `type` och tar bort både entiteten och relationslänkar till den. Använd det när ett objekt inte längre ska kunna dyka upp i svar – till exempel en utgången produkt eller en inställd tjänst.

## Egendefinierade properties gör datan filtrerbar

Vissa entitetstyper kan ha `properties` med korta, strukturerade värden. Använd camelCase-namn som `categoryName`, `publishedAt` eller `market`, och välj typ `string`, `number`, `boolean` eller `date`. Samma fält kan senare användas i chatt- och sökanrop med filter som `$eq`, `$gt`, `$gte`, `$lt`, `$lte` och `$in`.

Det här är användbart när en assistent har flera marknader, varugrupper eller publiceringsnivåer. Du kan fylla samma kunskapsbas brett, men be chatten svara från bara en källa, en marknad eller en innehållstyp.

## Chatt kan integreras på tre nivåer

Den enklaste vägen är att använda coreAI:s chattwidget. Då hanterar widgeten samtals-ID, språk, aktuell URL och strömning åt dig. För en skräddarsydd upplevelse kan du anropa `/assistants/{assistantId}/chat` direkt och skicka `question`, valfri `cid`, `lang`, `model`, `sources`, `resources`, `filters` och `stream`.

Om du integrerar chatt själv måste du hämta nödvändig konfiguration från `/assistants/{assistantId}/config`. Svaret ger tillgängliga modeller, källor och WebSocket-uppsättning för strömning. Chattströmmar publiceras på `ai-chat.<cid>` med händelserna `ChatStreamProgress` och `ChatStreamUpdated` via WebSocket.

Om du inte behöver ett fullständigt samtal kan `/assistants/{assistantId}/search` användas som kunskapsbassökning. Det returnerar träffar, flikar per typ och eventuellt en AI-genererad sammanfattning. Strömmad sammanfattning använder kanalen `ai-summary.<uuid>` och händelsen `SummaryUpdated`.

## En bra integration är en synkronisering, inte en engångsimport

Den robusta modellen är att låta källsystemet äga sanningen och coreAI vara den sökbara, samtalsfärdiga kopian. Skicka uppdateringar med stabila externa ID:n, använd `lastModifiedAt`, ta bort objekt som inte längre ska ge svar, och lägg på properties som gör filtrering möjlig. Då får assistenten färsk data, spårbara källor och ett chattgränssnitt som kan byggas så enkelt eller specialiserat som din produkt kräver.