# Send dokumenter fra dine egne systemer
Source: https://nordvec.com/no/docs/guides/how-to/push-documents

Opprett en datakilde, send dokumenter til den med en indekserings-API-nøkkel, velg hvem som kan lese dem, og sett den på pause eller slett den når kilden endres.



Push-API-et indekserer dokumenter fra systemer Nordvec ikke har kobling for: en intern wikieksport, et billetarkiv, en database med notater. Du sender teksten og hvem som kan lese den; Nordvec lagrer den i EU, indekserer den, og gjør den søkbar og sitérbar som ethvert annet dokument. Hvert dokument du pusher, havner i en **datakilde**, en navngitt beholder i arbeidsområdet ditt som en administrator for arbeidsområdet oppretter først. En push som navngir en datakilde som ikke finnes, eller en som er satt på pause, blir avslått.

## Opprett en datakilde [#opprett-en-datakilde]

Gå til **Workspace settings > Datakilder** og velg **Create datasource**. Administratorer og eiere for arbeidsområdet kan gjøre dette; i et personlig arbeidsområde er det deg.

| Felt | Merknader                                                                                                                                 |
| ---- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| Navn | Det folk ser i innstillingslisten. Opptil 200 tegn.                                                                                       |
| Slug | Det hver push navngir. Små bokstaver, sifre, `-` og `_`, starter med en bokstav eller et siffer, opptil 200 tegn. Kan ikke endres senere. |

Slug-en `confluence-export` brukes i eksemplene nedenfor.

## Opprett en indekserings-API-nøkkel [#opprett-en-indekserings-api-nøkkel]

Push-forespørsler autentiseres med en API-nøkkel av **Indexing**-klassen som har `index:write`-omfanget. Legg til `index:status` for å spore inntak og `index:delete` for å fjerne dokumenter eller erstatte en hel datakilde. Opprett en under **Workspace settings > API keys**. Den rå nøkkelen starter med `nv_eu_idx_` og vises én gang. Se [Authentication](/docs/guides/authentication). Hver forespørsel må også oppgi arbeidsområde-ID-en din som `tenantId`, ID-en i arbeidsområdets adresse i appen (`/w/<workspace id>/...`), og det må være arbeidsområdet nøkkelen tilhører.

## Push ett dokument [#push-ett-dokument]

`/documents/push` oppretter dokumentet, eller oppdaterer det når et dokument med samme `id` allerede finnes i datakilden.

```bash
curl https://nordvec.com/api/v1/documents/push \
  -H "Authorization: Bearer $NORDVEC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: page-4711-2026-09-28" \
  -d '{
    "tenantId": "YOUR_WORKSPACE_ID",
    "document": {
      "id": "page-4711",
      "title": "Travel expense policy",
      "datasource": "confluence-export",
      "body": { "mimeType": "text/markdown", "content": "# Travel expenses\n..." },
      "permissions": {},
      "sourceUrl": "https://wiki.example.com/pages/4711",
      "type": "policy"
    }
  }'
```

```json
{ "documentId": "page-4711", "status": "queued", "updated": false }
```

* `id` er din stabile id for dokumentet innenfor datakilden. Å pushe samme `id` på nytt oppdaterer det; uendret innhold gjenkjennes på sin hash og indekseres ikke to ganger.
* `body.mimeType` er ett av `text/plain`, `text/markdown`, `text/html`, `application/pdf`, eller Word-, Excel- og PowerPoint-typer (`.docx`, `.xlsx`, `.pptx`). Binært innhold sendes base64-kodet.
* `sourceUrl` blir «hopp til kilde»-lenken på hver sitat av dokumentet. Utelat den ved en ny push for å beholde den lagrede, eller send `null` for å tømme den.
* `type` setter dokumentets `content_type`, som søk og lister filtrerer på.

Hele forespørselskroppen er begrenset til 1 MB, så en stor fil eller et stort parti svarer med `413`; del den opp.

## Velg hvem som kan lese det [#velg-hvem-som-kan-lese-det]

`permissions` er påkrevd ved hver push, så en delingsbeslutning tas aldri ved å utelate et felt. I en datakilde som er synlig for arbeidsområdet:

| `permissions`                             | Hvem som kan lese dokumentet                                     |
| ----------------------------------------- | ---------------------------------------------------------------- |
| `{}`                                      | Alle medlemmer av arbeidsområdet                                 |
| `{ "allowedUsers": ["ana@example.com"] }` | Bare de oppførte personene                                       |
| `{ "allowedGroups": ["GROUP_ID"] }`       | Medlemmer av de arbeidsområdegruppene, inkludert nestede grupper |
| `{ "allowAllTenantMembers": false }`      | Avslått: et dokument som ingen kan lese, er en sletting          |

For å endre hvem som kan lese et dokument uten å sende innholdet på nytt, bruk
`POST /documents/push/permissions`. Å gjøre et allerede begrenset dokument synlig for hele arbeidsområdet krever i tillegg `index:acl-widen`-omfanget,
så en rutinesynkronisering ikke stille og rolig kan oppheve en begrensning noen har satt manuelt.

## Push i grupper [#push-i-grupper]

`/documents/push/bulk` tar imot opptil 100 dokumenter for én datakilde per kall. Svaret teller `accepted` og `rejected` og gir et resultat per dokument, så ett dårlig dokument ikke feiler hele batchen. Grensen på 1 MB gjelder per kall, så del opp store opplastinger i flere kall under samme `uploadId`.

```bash
curl https://nordvec.com/api/v1/documents/push/bulk \
  -H "Authorization: Bearer $NORDVEC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tenantId": "YOUR_WORKSPACE_ID",
    "uploadId": "nightly-2026-09-28",
    "datasource": "confluence-export",
    "documents": [
      { "id": "page-4711", "title": "Travel expense policy", "datasource": "confluence-export",
        "body": { "mimeType": "text/plain", "content": "..." }, "permissions": {} }
    ]
  }'
```

## Erstatt en hel datakilde [#erstatt-en-hel-datakilde]

Når systemet ditt kan liste alt en datakilde skal inneholde, send hele listen som én **opplastingsøkt**. Dokumentene som ikke lenger finnes i listen, flyttes til papirkurven når økten avsluttes. Økter krever en indekserings-API-nøkkel som har både `index:delete` og `index:write`, fordi avslutningen fjerner dokumenter. Nøkkelen som åpner en økt, er den eneste som kan fortsette den.

1. Send første side med `"isFirstPage": true`. Det er side `0`.
2. Send hver videre side med dens `pageIndex` (`1`, `2`, ...), i hvilken som helst rekkefølge.
   En side som sendes to ganger, telles én gang, så en ny forsøk er alltid trygt.
3. Send siste side med `"isLastPage": true` og dens `pageIndex`. En liste
   som passer i én side, sender `isFirstPage` og `isLastPage` sammen. Den
   siste siden kan være uten dokumenter.

Hver side bruker samme `uploadId`, og hvert svar inneholder øktens fremdrift under `upload`. Økten avsluttes først når alle sider fra `0` til den siste er mottatt. Når økten avsluttes, flyttes hvert dokument i datakilden som ingen side i økten nevnte, og som fantes før økten startet, til papirkurven. Enhver annen push til datakilden mens økten kjører, beholder dokumentet den nevner: en enkelt push, en batch uten øktfelter, en oppdatering av tillatelser eller en ny push av uendret innhold. Papirkurven beholder det som ble flyttet dit i 30 dager. Å pushe et dokument på nytt henter det tilbake, og det samme gjør gjenoppretting av hele økten (se nedenfor).

En økt som ikke mottar noen side på 24 timer, utløper og avsluttes uten å fjerne noe. En avvist side besvares med `409 Conflict`, skriver ingenting, og dens `data.reason` forklarer hvorfor:

| `reason`                                               | Hva du skal gjøre                                                                                                                                                                                                                                                                                                                      |
| ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `upload_incomplete`                                    | Send sidene som er oppført i `missingPageIndexes`, deretter den siste siden på nytt                                                                                                                                                                                                                                                    |
| `deletion_confirmation_required`                       | Avslutningen ville flyttet mer enn 20 % av datakilden til papirkurven. Hvis det er riktig, send den siste siden på nytt med `"confirmDeletions"` satt til `wouldTombstone`                                                                                                                                                             |
| `deletion_confirmation_too_large`                      | `confirmDeletions` er større enn antall dokumenter datakilden hadde da økten startet. Send antallet du forventer å fjerne                                                                                                                                                                                                              |
| `upload_in_progress`                                   | Det er en åpen økt på denne datakilden. Hvis det er din nøkkels økt, fullfør den, vent til den utløper, eller start på nytt med `"forceRestartUpload": true` på første side. Hvis en annen nøkkel åpnet den, erstatter `forceRestartUpload` den først når den ikke har mottatt noen side på én time, fra tidspunktet i `restartableAt` |
| `upload_expired`, `upload_missing`, `upload_restarted` | Økten er borte. Start en ny med en ny `uploadId`                                                                                                                                                                                                                                                                                       |
| `upload_closed`, `upload_id_reused`                    | `uploadId` er oppbrukt. Bruk en ny                                                                                                                                                                                                                                                                                                     |
| `page_index_required`                                  | Din nøkkel har en åpen økt på denne datakilden. Send `pageIndex` med siden                                                                                                                                                                                                                                                             |

For å fortsette etter et krasj, les økten med `GET /documents/push/upload?tenantId=...&datasource=...&uploadId=...` (omfang `index:status`). Dens `missingPageIndexes` viser hvilke sider som fortsatt må sendes.

### Angre en økts avslutning [#angre-en-økts-avslutning]

Hvis en økt fjernet dokumenter den ikke skulle ha fjernet, for eksempel fordi listen den sendte ble avkortet, kan du gjenopprette dem med én kall:

```bash
curl https://nordvec.com/api/v1/documents/push/upload/restore \
  -H "Authorization: Bearer $NORDVEC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "tenantId": "YOUR_WORKSPACE_ID", "datasource": "confluence-export", "uploadId": "nightly-2026-09-28" }'
```

Nøkkelen som åpnet økten, kan gjenopprette den, og det samme kan en arbeidsområdeadministrator som er pålogget Nordvec, for en økt som ble åpnet med hvilken som helst nøkkel. Hvert dokument som ble flyttet til papirkurven ved avslutningen, kommer tilbake med innholdet det hadde, og svaret teller dem: `restored` er aktive igjen, `purged` var allerede slettet for godt fra papirkurven, og `skipped` hadde endret seg siden avslutningen (ble sendt på nytt eller fjernet på nytt) og ble stående som de er. Å gjenopprette en økt to ganger svarer med de samme tallene som første gjenoppretting og `"replayed": true`, og setter i kø alle gjenopprettede dokumenter som fortsatt venter på å bli indeksert. Det er derfor trygt å gjenta en gjenoppretting som ikke ga svar. En økt kan gjenopprettes i 35 dager etter at den ble avsluttet, og så lenge papirkurven fortsatt inneholder minst ett dokument som ble fjernet. Et avslått gjenopprettingsforsøk svares med `409 Conflict` og dens `data.reason`:

| `reason`                 | Hva det betyr                                                                                                                                                                                                                                |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `upload_not_closed`      | Økten er aldri blitt avsluttet, så den fjernet ingen dokumenter                                                                                                                                                                              |
| `upload_in_progress`     | Det er en åpen økt på datakilden. Gjenopprett når den er avsluttet eller utløpt                                                                                                                                                              |
| `restore_purged`         | Det har gått mer enn 30 dager, og papirkurven har slettet alle dokumentene. Send dem på nytt                                                                                                                                                 |
| `workspace_not_entitled` | Arbeidsområdets abonnement tillater for øyeblikket ikke gjenoppretting fra papirkurven                                                                                                                                                       |
| `corpus_cap_exceeded`    | Å hente dokumentene tilbake ville overskride arbeidsområdets dokumentgrense, så ingen kom tilbake. `data.wouldRestore` er hvor mange det trenger, og `data.headroom` hvor mange som får plass. Frigjør plass, og prøv å gjenopprette på nytt |

## Spor inntak [#spor-inntak]

En push svarer så snart dokumentet er satt i kø. Spør om fremdriften med `GET /documents/push/status` (omfang `index:status`), filtrert etter datakilde eller dokument-id. Et dokument går fra `queued` via `processing` til `completed`, eller til `failed` med en `error`.

## Når en push blir avslått [#når-en-push-blir-avslått]

En push som navngir en ukjent eller satt-på-pause-datakilde svarer med `422 Unprocessable Content`. Meldingen navngir slug-en og lenker til **Workspace settings > Datakilder** i arbeidsområdet ditt, og feilens `data` forklarer hvorfor og hva du skal gjøre:

```json
{
  "defined": true,
  "code": "UNPROCESSABLE_CONTENT",
  "status": 422,
  "message": "Datasource \"confluence-export\" is paused and accepts no documents. A workspace admin resumes it under Workspace settings > Datasources: https://nordvec.com/w/YOUR_WORKSPACE_ID/workspace/settings?tab=datasources",
  "data": {
    "why": "The datasource \"confluence-export\" is paused",
    "fix": "Resume it at https://nordvec.com/w/YOUR_WORKSPACE_ID/workspace/settings?tab=datasources, then retry the push",
    "link": "https://nordvec.com/docs/guides/how-to/push-documents"
  }
}
```

Ikke prøv disse på nytt automatisk: de lykkes først etter at en administrator oppretter eller gjenopptar datakilden.

## Fjern et dokument [#fjern-et-dokument]

`POST /documents/push/delete` (scope `index:delete`) fjerner et opplastet dokument ved hjelp av `datasource` og `id`. Dokumenter du slutter å laste opp, blir ikke fjernet av seg selv: slett hvert dokument du avvikler, eller send datakildens fulle liste som en opplastingsøkt, som beskrevet ovenfor.

## Pause, gjenoppta og slett [#pause-gjenoppta-og-slett]

* **Pause** avslår alle videre pushes til datakilden. Dokumentene forblir søkbare. En push som allerede er under skriving når du setter på pause, fullføres.
* **Resume** godtar pushes igjen.
* **Delete** fjerner datakilden og alle dokumenter som er pushet til den, sammen med søkeindeksen. Ditt eget system beholder sin kopi, så å pushe på nytt etter at du oppretter datakilden igjen, gjenoppretter dem. En sletting kan ikke angres.

Hvis en annen administrator har endret datakilden etter at listen din lastet, blir handlingen avslått og listen lastes på nytt, så du bestemmer deg på nytt ut fra det som nå finnes. Hver oppretting, pausing, gjenopptaking og sletting loggføres i arbeidsområdets revisjonslogg.

<Callout>
  Innstillingslisten viser hvem hver datakilde er synlig for. Hvem som kan lese et dokument du har pushet, bestemmes av `permissions` som sendes med det; å opprette, sette på pause eller slette en datakilde utvider aldri tilgangen til noe.
</Callout>

<Callout>
  Push-skrivinger er idempotente: gjenta samme `Idempotency-Key` ved hvert forsøk på én skriving, og en duplikat besvares fra det første forsøket i stedet for å bli brukt to ganger. Se [Feil og ratelimiter](/docs/guides/errors-and-rate-limits).
</Callout>

## Neste steg [#neste-steg]

<Cards>
  <Card title="List og hent dokumenter" href="/docs/guides/how-to/list-documents" />

  <Card title="Filtrer og raffiner søk" href="/docs/guides/how-to/filter-search" />

  <Card title="API-referanse" href="/docs/api" />
</Cards>
