# Slik fyller du ein coreAI-assistent med data via API-et

coreAI-API-et er laga for system som vil sende eigne data direkte inn i ein assistent og bruke dei som svargrunnlag i chat eller søk. Integrasjonen handlar først om å halde kunnskapsbasen oppdatert, deretter om å velje korleis brukarane skal møte assistenten: gjennom coreAI-widgeten, eit eige chatgrensesnitt eller eit reint søk.

## Start med assistent, kjelde og token

Alle kall mot API v2 går mot `https://portal.coreai.no/api/v2` i produksjon eller `https://stage.coreai.no/api/v2` i testmiljøet. API-et brukar eit Bearer-token, og dei viktigaste stiane treng både `assistantId` og `contentImporterId`.

`assistantId` peikar på assistenten som skal svare. `contentImporterId` peikar på API-kjelda der dataene blir lagra. Når du les entitetar tilbake med ekstern ID, søkjer coreAI i den oppgjevne kjelda.

## Upsert er hovudløypa for å fylle assistenten

For ein løpande integrasjon bør systemet ditt sende ein `POST` til `/assistants/{assistantId}/sources/{contentImporterId}` kvar gong eit objekt vert oppretta eller endra. Upsert erstattar heile entiteten: første kallet opprettar han, seinare kall oppdaterer den same `id`-en. Du treng altså ikkje å gjere ekstra kall for å sjekke om entiteten allereie finst, upsert løyser dette for deg.

```json
{
  "data": [
    {
      "id": "product-123",
      "type": "products",
      "lastModifiedAt": "2026-04-28T12:00:00Z",
      "attributes": {
        "productNumber": "123",
        "name": "Fjelljakke",
        "description": "Lett skaljakke for skiftande vêr.",
        "url": "https://example.com/products/123",
        "price": 1299,
        "inStock": true
      }
    }
  ]
}
```

Entitetstypane dekkjer dei vanlegaste datakjeldene ein assistent treng: `products`, `contents`, `documents`, `events`, `contacts`, `job_postings` og `educations`. Kvar type har sine eigne påkravde felt. Produkt treng til dømes `name` og `productNumber`, medan innhald treng `name` og `longDescription`.

## Bruk PATCH når berre delar av entiteten endrar seg

`PATCH` mot same endepunkt let deg sende berre felta som er endra. Det passar når eit eksternt system publiserer små statusendringar, til dømes pris, lagerstatus eller dato.

## Sletting av entitetar

`DELETE` tek ei enkel liste med `id` og `type`, og fjernar både entiteten og relasjonslenker til han. Bruk det når eit objekt ikkje lenger skal kunne dukke opp i svar — til dømes eit utgått produkt eller ei avlyst stilling.

## Eigendefinerte properties gjer dataene filtrerbare

Nokre entitetstypar kan ha `properties` med korte, strukturerte verdiar. Bruk camelCase-namn som `categoryName`, `publishedAt` eller `market`, og vel type `string`, `number`, `boolean` eller `date`. Dei same felta kan seinare brukast i chat- og søkjekall med filter som `$eq`, `$gt`, `$gte`, `$lt`, `$lte` og `$in`.

Dette er nyttig når éin assistent har fleire marknader, varegrupper eller publiseringsnivå. Du kan fylle den same kunnskapsbasen breitt, men be chatten svare frå berre éi kjelde, éin marknad eller éin innhaldstype.

## Chat kan integrerast på tre nivå

Den enklaste vegen er å bruke coreAI sin chatwidget. Då handterer widgeten samtale-ID, språk, gjeldande URL og strauming for deg. For ei skreddarsydd oppleving kan du kalle `/assistants/{assistantId}/chat` direkte og sende `question`, valfri `cid`, `lang`, `model`, `sources`, `resources`, `filters` og `stream`.

Dersom du integrerer chat sjølv, må du hente påkravd konfigurasjon frå `/assistants/{assistantId}/config`. Svaret gjev tilgjengelege modellar, kjelder og WebSocket-oppsett for strauming. Chatstraumar vert publiserte på `ai-chat.<cid>` med hendingane `ChatStreamProgress` og `ChatStreamUpdated` via WebSocket.

Viss du ikkje treng ein full samtale, kan `/assistants/{assistantId}/search` brukast som kunnskapsbasesøk. Det returnerer treff, faner per type og eventuelt eit KI-generert samandrag. Strauma samandrag brukar kanalen `ai-summary.<uuid>` og hendinga `SummaryUpdated`.

## Ein god integrasjon er ei synkronisering, ikkje ein eingongsimport

Den robuste modellen er å la kjeldesystemet eige sanninga og coreAI vere den søkbare, samtaleklare kopien. Send oppdateringar med stabile eksterne ID-ar, bruk `lastModifiedAt`, slett objekt som ikkje lenger skal gje svar, og legg på properties som gjer filtrering mogleg. Då får assistenten ferske data, sporbare kjelder og eit chatgrensesnitt som kan byggjast så enkelt eller spesialisert som produktet ditt krev.