Asiakirjojen tuonti
Tässä oppaassa näytetään, miten viet asiakirjasi Sursaan korttien API:n avulla: muutaman asiakirjan skriptistä tai järjestelmän kaikki asiakirjat säännöllisesti ajettavalla työllä. Jokaisesta asiakirjasta tulee kokoelmaan kortti. Ihmiset löytävät sen haulla, avustaja vastaa sen perusteella, ja sillä on omistaja, tunnisteet, vahvistus ja käyttöoikeudet kuten millä tahansa muulla kortilla.
Jos haluat, että Sursa päättelee, mitkä asiakirjat järjestelmästäsi on poistettu, tai lähetät asiakirjoja integraatioalustalta, käytä sen sijaan mukautettua lähdettä. Se on tehty täysiä ja inkrementaalisia synkronointeja varten. Tämä opas käsittelee suoria kirjoituksia kokoelmaan.
Tarvitset API-avaimen, jolla on käyttöalue cards:write ja rooli, joka voi kirjoittaa kohdekokoelmaan (editor tai
admin). Esimerkit käyttävät apufunktiota, joka esitellään oppaassa Pika-aloitus.
Oikean päätepisteen valinta
| Sinulla on | Käytä |
|---|---|
| Tietue, jolla on järjestelmässäsi pysyvä tunnus | PUT /v1/cards-by-external-id/{external_id}: luo tai korvaa tunnuksesi mukaan. |
| Teksti, joka lisätään kerran ilman omaa tunnusta | POST /v1/cards/text |
| Tiedosto, joka lisätään kerran | POST /v1/cards |
| ZIP-arkisto, jossa on monta tiedostoa | POST /v1/cards/archive |
| Tiedosto, joka on suurempi kuin yhden pyynnön raja | Lataus osissa ja sen jälkeen mikä tahansa yllä olevista päätepisteistä. |
| Uusi sisältö jo olemassa olevalle kortille | PUT /v1/cards/{card_id}/content |
Käytä external_id-kenttää kaikessa, mitä tuot useammin kuin kerran. Sen ansiosta jokainen tuonti on
toistettavissa: uusi ajo päivittää aiemmin luomansa kortit eikä lisää kopioita.
Kortin luominen tai korvaaminen omalla tunnuksella
PUT /v1/cards-by-external-id/{external_id} ottaa järjestelmäsi tietueen tunnuksen. Jos millään kortilla ei ole tätä
external_id-tunnusta, pyyntö luo kortin (201). Jos jollakin kortilla on se, pyyntö korvaa kortin sisällön ja
tiedot (200).
curl -X PUT https://api.sursa.com/v1/cards-by-external-id/kb-article-1042 \
-H "Authorization: Bearer $SURSA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"collection_id": 3,
"folder_id": "0f8e2d7c-4b6a-4e1f-9c3d-2a5b8e7f1c40",
"title": "Returning a damaged item",
"content_type": "html",
"body": "<h2>Damaged items</h2><p>Send a photo within 7 days and we ship a replacement.</p>",
"tags": ["returns", "shipping"],
"metadata": {"source": "helpdesk", "article_id": "1042"}
}'Mitä toistossa tapahtuu:
- Sisältö ei muuttunut: uutta versiota ei luoda. Vastaus on
200, ja siinä on"status": "skipped"ja"reason": "unchanged". Pyynnön toistaminen on aina turvallista, myös ilmanIdempotency-Key-otsaketta. - Sisältö muuttui: kortti saa uuden version, ja se indeksoidaan uudelleen. Sen otsikko, tunnisteet, omistaja,
luokka ja
metadatasaavat lähettämäsi arvot;metadatakorvataan kokonaisuutena. - Kokoelma ja kansio otetaan huomioon vain kortin luonnissa. Jos haluat siirtää korttia myöhemmin, muuta sitä
PATCH /v1/cards/{card_id}-pyynnöllä.
Uusi versio poistaa kortin vahvistuksen, kuten mikä tahansa sisällön muutos: vahvistaja vahvistaa kortin uudelleen.
Tekstimuodot
content_type | Runko on |
|---|---|
markdown (oletus) | Markdownia. |
html | HTML:ää. Se siistitään yksinkertaiseksi merkinnäksi: otsikot, kappaleet, luettelot, taulukot sekä http-, https- ja mailto-linkit. Skriptit, tyylit, kehykset, lomakkeet ja kuvat poistetaan sisältöineen. |
text | Pelkkää tekstiä. Kappaleet erotetaan tyhjillä riveillä. |
Odotetaanko korttia vai ei
Oletuksena pyyntö palaa, kun kortti on valmis löydettäväksi, ja vastauksessa on "status": "ready" ja kortti
card-kentässä. Tämä kestää sekunnin murto-osasta lyhyellä tekstillä minuuttiin tai pidempään pitkällä tiedostolla.
Massatuonneissa lähetä "async": true. Vastaus tulee heti, ja siinä on "status": "queued" ja indeksointityö
job-kentässä (job_id-tunnuksineen). Tarkista työ GET /v1/jobs/{job_id} -pyynnöllä tai
seuraa kaikkia töitä virrasta GET /v1/jobs/stream. Työ päättyy, kun status on
done, error tai canceled.
curl https://api.sursa.com/v1/jobs/48213 \
-H "Authorization: Bearer $SURSA_API_KEY"Tiedoston lataaminen
Tiedostot lähetetään multipart/form-data-pyynnössä file-kentässä. Sursa lukee PDF-, Word-, Excel- ja
PowerPoint-tiedostot, OpenDocument-laskentataulukot, CSV-, Markdown-, HTML- ja AsciiDoc-tiedostot, sähköpostit
(.eml), pelkän tekstin ja yleiset kuvamuodot. Se tarkistaa, että tiedoston nimi, ilmoitettu tyyppi ja sisältö
vastaavat toisiaan, ja hylkää ristiriitaisen tiedoston 415-vastauksella.
Jos haluat luoda tai korvata tiedostokortin omalla tunnuksellasi, lähetä tiedosto samaan
PUT /v1/cards-by-external-id/{external_id} -päätepisteeseen:
curl -X PUT https://api.sursa.com/v1/cards-by-external-id/handbook-2026 \
-H "Authorization: Bearer $SURSA_API_KEY" \
-F "file=@employee-handbook.pdf" \
-F "collection_id=3" \
-F "tags=hr,policies" \
-F 'metadata={"owner_team":"people"}'Lomakkeessa tags on pilkuilla eroteltu merkkijono ja metadata merkkijonoksi kirjoitettu JSON-objekti. Uusi kortti
ilman title-kenttää saa otsikokseen tiedoston nimen.
Jos haluat lisätä tiedoston kerran ilman omaa tunnusta, käytä POST /v1/cards -pyyntöä
samalla lomakkeella ja Idempotency-Key-otsakkeella. Jos lataat tiedoston, joka kokoelmassa jo on, vastaus on
"status": "skipped", ja siinä on "duplicate": true ja olemassa oleva card_id, ellet anna external_id-tunnusta.
Yhden tiedoston kokoa rajoittaa asennus (oletuksena 200 Mt). Suuremmat tiedostot, samoin kuin tiedostot epäluotettavissa verkoissa, kannattaa ladata ensin osissa.
Kortin sisällön korvaaminen
Kun tiedät kortin Sursa-tunnuksen, PUT /v1/cards/{card_id}/content
korvaa sen tekstin tai tiedoston ja säilyttää kaiken muun: omistajan, tunnisteet, vahvistajat, vahvistusvälin ja
käsin asetetun luokan.
curl -X PUT https://api.sursa.com/v1/cards/3f2c9a7e-5b1d-4c8e-9f0a-1b2c3d4e5f60/content \
-H "Authorization: Bearer $SURSA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content_type": "markdown", "body": "# Refund policy\n\nRefunds are processed within 10 days."}'- Sama sisältö uudelleen palauttaa
"status": "skipped"ja"reason": "unchanged". - Kortti, jota indeksoidaan juuri nyt, palauttaa
409-vastauksen ja koodincards.indexing_in_progress. Yritä uudelleen muutaman sekunnin kuluttua. - Lähteestä, kuten liittimestä tai mukautetusta lähteestä, peräisin olevaa korttia muutetaan vain sen lähteessä:
cards.managed_by_source. - Avaimen täytyy saada nähdä koko kortti; osittain näkyvä kortti palauttaa koodin
cards.content_whole_access.
Monen asiakirjan tuonti
Silmukka, joka käy tietueesi läpi PUT /v1/cards-by-external-id/… -pyynnöillä, on yksinkertaisin massatuonti, ja sen
voi turvallisesti pysäyttää ja ajaa uudelleen missä vaiheessa tahansa. Näin teet siitä nopean ja nopeusrajoituksen
kannalta ystävällisen:
- Lähetä
"async": true, jotta jokainen pyyntö palaa heti, kun kortti on jonossa. - Aja muutama pyyntö rinnakkain (4–8) ja hidasta, kun
RateLimit-otsake näyttää, että pyyntöjä on jäljellä vähän. Ks. Nopeusrajoitukset ja kiintiöt. - Kun vastaus on
429, odotaRetry-After-ajan verran; verkkovirheen tai5xx-vastauksen jälkeen yritä samaa pyyntöä uudelleen. Toistot ovat vaarattomia. - Kirjaa jokaisen virheeseen päättyneen tietueen
external_idja yritä niitä uudelleen lopuksi.
import { api } from "./sursa.mjs";
async function importAll(records, concurrency = 6) {
const failed = [];
const queue = [...records];
async function worker() {
for (let record = queue.shift(); record; record = queue.shift()) {
try {
await api("PUT", `/v1/cards-by-external-id/${encodeURIComponent(record.id)}`, {
collection_id: 3,
title: record.title,
content_type: "html",
body: record.html,
metadata: { source: "helpdesk" },
async: true,
});
} catch (error) {
failed.push({ id: record.id, error: String(error) });
}
}
}
await Promise.all(Array.from({ length: concurrency }, worker));
return failed;
}ZIP-arkiston tiedostoista POST /v1/cards/archive tekee yhdellä pyynnöllä
kortin jokaisesta tuetusta tiedostosta. Se vastaa heti suunnitelmalla (mistä tiedostoista tulee kortteja ja mitkä
ohitetaan ja miksi) ja työllä; GET /v1/archives/{job_id} kertoo tuloksen.
Tuotujen korttien etsiminen ja poistaminen
- Lue kortti omalla tunnuksellasi
GET /v1/cards-by-external-id/{external_id}-pyynnöllä. - Listaa yhden tuonnin kortit metatietosuodattimella:
GET /v1/cards?metadata[source]=helpdesk. Ks. Metatiedot. - Poista kortti
DELETE /v1/cards/{card_id}-pyynnöllä.
Yleiset virheet
| Koodi | Syy | Mitä tehdä |
|---|---|---|
collections.not_found | Avain ei näe kokoelmaa, jolla on tämä tunnus tai nimi. | Tarkista collection_id pyynnöllä GET /v1/collections. |
collections.no_write_access | Avain ei saa kirjoittaa tähän kokoelmaan. | Käytä avainta, jolla on rooli editor ja pääsy kokoelmaan. |
cards.external_id_taken | POST, jonka external_id on jo toisella kortilla. | Korvaa kortti PUT /v1/cards-by-external-id/… -pyynnöllä. |
cards.managed_by_source | Kortti kuuluu lähteeseen. | Muuta asiakirjaa sen lähteessä. |
files.type_mismatch | Tiedoston nimi, tyyppi ja sisältö ovat ristiriidassa. | Lähetä tiedosto sen oikealla tiedostopäätteellä. |
files.too_large | Tiedosto ylittää latausrajan tai organisaation tallennustilan. | Käytä latausta osissa tai vapauta tallennustilaa. |
limits.cards | Organisaatio on saavuttanut pakettinsa korttirajan. | Poista kortit, joita ei enää tarvita, tai vaihda pakettia. |
api.metadata_invalid | metadata ylittää rajan. | Ks. Metatiedot. |