Synkronisér dit system med en brugerdefineret kilde
En brugerdefineret kilde forbinder et system, der ikke har en indbygget connector: din wiki, dit ticketsystem, en database, en eksport fra et hvilket som helst sted. Din kode sender dokumenter til Sursa, og Sursa gør dem til kort i den samling og de mapper, som kilden er sat op til, med den samme søgning, de samme svar, den samme verificering og de samme tilladelser som kort fra enhver anden kilde.
I modsætning til at skrive kort direkte holder en brugerdefineret kilde styr på, hvad du har sendt. Ved afslutningen af en fuld synkronisering arkiverer Sursa alle dokumenter, som du ikke sendte, så sletninger i dit system når frem til Sursa uden ekstra arbejde.
Sæt kilden op
En administrator opretter kilden i Sursa under Sources → New source → Custom source (kilder, ny kilde, brugerdefineret kilde) og vælger:
- samlingen og eventuelt en mappe til kildens kort;
- mappetilstanden: alle kort i den valgte mappe eller undermapper, der afspejler hvert dokuments
path; - tilladelserne: samlingens tilladelser eller »som i kilden«, hvor hvert dokument angiver, hvem der må se det.
Kildens side viser dens id; eksemplerne bruger 42.
Vælg en nøgle
| Nøgle | Begynder med | Kan |
|---|---|---|
| Kildenøgle | kbsrc_ | Skrive dokumenter i netop denne kilde. Intet andet: Den kan hverken læse eller søge. Opret den på kildens side under API keys. |
Organisationens nøgle med scopet import:write | kb_ | Skrive i enhver af organisationens brugerdefinerede kilder og læse kildens tilstand. Oprettelse af en kilde og dens nøgler kræver scopet admin. |
Kildenøglen er det sikreste valg til en enkelt integration, især en, der kører på en tredjepartsplatform. En
organisationsnøgle med import:write passer til en tjeneste, der forsyner flere kilder.
Begge nøgler sendes på samme måde, og alle push-operationer ligger under /v1/push/sources/{source_id}. Kontrollér
nøglen og kildens tilstand med GET /v1/push/sources/{source_id}:
curl https://api.sursa.com/v1/push/sources/42 \
-H "Authorization: Bearer $SURSA_SOURCE_KEY"{"source_id": 42, "name": "Helpdesk articles", "documents": 1840, "open_sync": null}
Dokumentet
| Felt | Påkrævet | Beskrivelse |
|---|---|---|
external_id | ja | Dit stabile id for dokumentet, op til 512 tegn. Sender du det samme id igen, erstattes dokumentet. |
title | ja | Kortets titel, op til 500 tegn. For en fil som standard filnavnet. |
content | ja, medmindre der er en fil | Op til 5 MB. |
content_type | nej | html (standard), markdown eller text. HTML renses for scripts, styles, formularer og indlejrede objekter. |
url | nej | Link til dokumentet i dit system, vist på kortet. |
path | nej | Mapper som et array (["Support", "Billing"]) eller en streng ("Support/Billing"), op til 10 niveauer. |
permissions | nej | {"everyone": true} eller {"emails": [...], "groups": [...]}. Bruges, når kildens tilladelser er »som i kilden«. |
tags | nej | Op til 50 tags, som føjes til kildens tags. |
author_email | nej | Er det en bruger i organisationen, bliver vedkommende ejer af kortet. |
updated_at | nej | Hvornår dokumentet blev ændret i dit system (RFC 3339). |
metadata | nej | Dine nøgle-værdi-par på kortet. Se Metadata. |
category | nej | Kortets kategori: nøglen for en af organisationens kategorier. |
verifiers, verify_interval_days | nej | Hvem der verificerer kortet (brugere efter e-mail og grupper), og hvor ofte, i dage. |
upload_id | nej | Dokumentets fil fra en upload i dele i stedet for content. |
attachments | nej | Op til 20 yderligere filer til dokumentet som en liste over upload_id. Hver af dem bliver til sit eget kort i kilden. |
I stedet for content kan et enkelt dokument have en fil på op til 100 MB i en multipart/form-data-anmodning: filen
i delen file og felterne ovenfor som JSON i delen document. Uploads i dele til upload_id og attachments oprettes
med en organisationsnøgle, der har scopet import:write og formålet import_attachment; en kildenøgle kan ikke oprette
dem.
To måder at sende på
Direkte opdateringer passer til systemer, der fortæller dig om hver ændring, fx en webhook fra dit helpdesk-system eller et trin i Zapier. Send et dokument, når det oprettes eller ændres, og slet det, når det fjernes:
| Anmodning | Gør |
|---|---|
POST /v1/push/sources/{source_id}/documents | Opretter eller erstatter ét dokument. |
POST /v1/push/sources/{source_id}/documents/batch | Opretter eller erstatter mange dokumenter på én gang. |
DELETE /v1/push/sources/{source_id}/documents/{external_id} | Fjerner ét dokument. URL-kod id’et. |
Ændringer bliver til kort inden for cirka et minut; flere ændringer i træk behandles samlet.
Synkroniseringer passer til faste eksporter: Du sender alt eller alt, der er ændret, og Sursa afstemmer. Resten af denne vejledning handler om synkroniseringer.
Kør en fuld synkronisering
En synkronisering har tre trin: åbne, sende og lukke.
1. Åbn
POST /v1/push/sources/{source_id}/syncs åbner en synkronisering og returnerer
dens nummer:
curl -X POST https://api.sursa.com/v1/push/sources/42/syncs \
-H "Authorization: Bearer $SURSA_SOURCE_KEY" \
-H "Idempotency-Key: sync-2026-10-24" \
-H "Content-Type: application/json" \
-d '{"type": "initial", "max_minutes": 180}'{"sync_number": 7, "type": "initial", "status": "open", "opened_at": "2026-10-24T02:00:00Z",
"expires_at": "2026-10-24T05:00:00Z", "pushed": 0, "removed": 0}
typeerinitialved kildens første synkronisering ogincremental, når en synkronisering er gennemført. Enincremental-synkronisering før den første gennemførte returnerersources.push_initial_required.- Der kan kun være én åben synkronisering ad gangen: En synkronisering mere returnerer
409sources.push_sync_open. - En synkronisering forbliver åben i
max_minutes(som standard 60, op til 1440). Derefter udløber den: Intet arkiveres, og dens nummer accepteres ikke længere. Vælg en tid, der er et godt stykke længere, end din eksport tager.
2. Send dokumenter
Send dokumenterne i batches på op til 500 med synkroniseringens nummer. En batchs brødtekst er op til 50 MiB; filer
i en batch angives som upload_id.
curl -X POST https://api.sursa.com/v1/push/sources/42/documents/batch \
-H "Authorization: Bearer $SURSA_SOURCE_KEY" \
-H "Idempotency-Key: sync-7-batch-1" \
-H "Content-Type: application/json" \
-d '{
"sync_number": 7,
"documents": [
{"external_id": "faq-shipping", "title": "Shipping", "content_type": "markdown",
"content": "# Shipping\n\nWe ship worldwide within 5 days.", "path": ["Support"]},
{"external_id": "faq-refunds", "title": "Refunds", "content_type": "html",
"content": "<p>Refunds take 14 days.</p>", "path": ["Support", "Billing"],
"permissions": {"groups": ["Support"]}, "metadata": {"article_id": "1042"}}
]
}'Svaret har et resultat for hvert dokument i den rækkefølge, du sendte dem:
{
"results": [
{"external_id": "faq-shipping", "result": "unchanged", "status": "indexed", "card_id": "8c1d…", "version": "5e0f…"},
{"external_id": "faq-refunds", "result": "updated", "status": "pending", "card_id": "3f2c…", "version": "a91b…"}
]
}
| Felt | Betydning |
|---|---|
result | Hvad der skete med dokumentet nu: created, updated, unchanged, deleted, not_found, error eller skipped (i en atomar batch, der ikke blev anvendt). |
status | Hvor dokumentet er på vejen til et kort: pending, processing (kortet er skrevet og er ved at blive indekseret), indexed, failed eller removed. |
card_id | Dokumentets kort, når det findes. |
version | En hash af indholdet og felterne. Det samme dokument sendt igen har samme version og er unchanged. |
error, reason | Hvorfor dokumentet mislykkedes. reason er en stabil kode: content_invalid, file_rejected, too_large, limit_reached, index_failed eller batch_rejected (et andet dokument i en atomar batch mislykkedes). |
Som standard behandles hvert dokument i en batch for sig: Ét dårligt dokument stopper ikke de andre.
Dokumenter, der ikke er ændret siden den sidste synkronisering, behøver ikke sendes igen. Bekræft dem efter id med
POST /v1/push/sources/{source_id}/syncs/{sync_number}/touch, op til 1000
id’er pr. anmodning, så den fulde afstemning beholder dem:
curl -X POST https://api.sursa.com/v1/push/sources/42/syncs/7/touch \
-H "Authorization: Bearer $SURSA_SOURCE_KEY" \
-H "Content-Type: application/json" \
-d '{"external_ids": ["faq-contact", "faq-hours"]}'3. Luk
POST /v1/push/sources/{source_id}/syncs/{sync_number}/close afslutter
synkroniseringen:
curl -X POST https://api.sursa.com/v1/push/sources/42/syncs/7/close \
-H "Authorization: Bearer $SURSA_SOURCE_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "complete"}'status | Virkning |
|---|---|
complete | Fuld afstemning. Alle kildens dokumenter, der hverken blev sendt eller bekræftet i denne synkronisering, arkiveres. Brug den kun, når du har sendt alt. |
complete_incremental | Anvender det, du har sendt, og arkiverer intet. |
failed | Arkiverer intet og beholder det, der allerede er sendt. Tilføj reason (fx API_ERROR) og error_details til loggen. |
Luk med failed, når din eksport stopper halvvejs: Et complete efter en delvis eksport ville arkivere alle de
dokumenter, du ikke nåede til. Gentager du den samme lukning, returneres det samme resultat.
Efter lukningen gør Sursa dokumenterne til kort inden for cirka et minut. Kildens side viser hver synkronisering med
antallet af sendte og arkiverede dokumenter, og GET /v1/push/sources/{source_id}/syncs/{sync_number}
returnerer de samme tællere.
Inkrementelle synkroniseringer
Mellem fulde synkroniseringer sender du kun det, der er ændret:
- Åbn med
"type": "incremental". - Send de ændrede dokumenter, og sæt id’erne for de fjernede i
deletes(se nedenfor). - Luk med
complete_incremental.
Kør en fuld synkronisering en gang imellem, fx ugentligt, for at fange det, som en inkrementel kørsel har overset.
Slet dokumenter i en batch
En batch kan fjerne dokumenter sammen med dem, den skriver. Angiv deres id’er i deletes:
{
"sync_number": 8,
"documents": [{"external_id": "faq-shipping", "title": "Shipping", "content": "…"}],
"deletes": ["faq-old-returns", "faq-fax"]
}
Hvert slettet id får sin egen post i results med result deleted eller not_found, hvis kilden ikke har et sådant
dokument. Det gør ingen skade at slette det samme id igen.
Atomare batches
Nogle ændringer giver kun mening sammen, fx et dokument og det dokument, der erstatter det. Send "atomic": true, så
anvendes batchen helt eller slet ikke: Består et dokument ikke kontrollen, anvendes intet fra batchen, og svaret er
422 med koden sources.push_batch_rejected og resultatet for hvert dokument i error.details.results: De dokumenter,
der mislykkedes, har error, de andre skipped.
{"sync_number": 8, "atomic": true, "documents": […], "deletes": ["faq-old-returns"]}
Uden atomic anvendes en batch dokument for dokument. Brug atomare batches til relaterede ændringer og almindelige
batches til masseindlæsninger, hvor ét dårligt dokument ikke skal holde resten tilbage.
Kontrollér resultatet for hvert dokument
Batchsvaret fortæller dig, hvordan hvert dokument blev skrevet. Omdannelsen til et kort sker bagefter, så status kan
stadig være pending. Sådan finder du de dokumenter i en synkronisering, der ikke blev til kort:
curl "https://api.sursa.com/v1/push/sources/42/syncs/7/documents?status=failed" \
-H "Authorization: Bearer $SURSA_SOURCE_KEY"Hver post har external_id, title, status, card_id, version og reason, og listen inddeles i sider med
cursor. status accepterer også pending, processing, indexed og removed.
Du kan også få besked i stedet for at spørge: Hændelserne import.sync_completed (en synkronisering er lukket og
behandlet, med totaler) og import.document_failed (et dokument blev ikke til et kort, med dets reason) kommer via
webhook og i hændelsesfeedet.
Nye forsøg
- Send en
Idempotency-Keymed hverPOST. En gentaget batch med samme nøgle returnerer det første resultat. - Selv uden nøglen bliver et dokument med samme
external_idaldrig til et kort mere: Det erunchangedellerupdated. - Stopper processen midt i en synkronisering, så åbn en ny, når den gamle er udløbet, eller luk den gamle med
failed, hvis du stadig har dens nummer, og kør synkroniseringen igen.
Grænser
| Grænse | Værdi |
|---|---|
| Indhold i ét dokument | 5 MB |
| Fil i en anmodning med ét dokument | 100 MB |
| Dokumenter pr. batch | 500 |
| Brødtekst i en batchanmodning | 50 MiB |
Id’er pr. touch-anmodning | 1000 |
| Dokumenter pr. kilde | Afhænger af prisplanen: fra 100.000 |
| Åben synkronisering | Som standard 60 minutter, op til 24 timer |
Et dokument ud over kildens grænse for dokumenter mislykkes med årsagen limit_reached i en batch; en anmodning med et
enkelt dokument returnerer 409 med koden sources.push_too_many_documents.
Hastighedsgrænser gælder som for enhver anden anmodning; se Hastighedsgrænser og kvoter.
Almindelige fejl
| Svar | Årsag | Hvad du gør |
|---|---|---|
401 sources.push_key_invalid | Nøglen er forkert, tilbagekaldt eller hører til en anden kilde. | Kontrollér nøglen og kildens id i stien. |
400 sources.push_document_invalid | Et påkrævet felt mangler, eller en grænse er overskredet. | Ret dokumentet; i en almindelig batch mislykkes kun det dokument. |
409 sources.push_sync_open | En anden synkronisering er stadig åben. | Luk den, eller vent, til den udløber. |
409 sources.push_sync_closed | Synkroniseringen er lukket eller udløbet. | Åbn en ny synkronisering; hæv max_minutes ved lange eksporter. |
403 sources.feature_disabled | Kilder er ikke en del af organisationens prisplan. | Kontakt administratoren. |
429 | For mange anmodninger. | Vent det antal sekunder, der står i Retry-After; send færre og større batches. |