Pereiti prie turinio
Sursa Developers

Sistemos sinchronizavimas per pasirinktinį šaltinį

Pasirinktinis šaltinis prijungia sistemą, kuri neturi integruotos jungties: jūsų wiki, užklausų valdymo įrankį, duomenų bazę, eksportą iš bet kur. Jūsų kodas siunčia dokumentus į Sursą, o Sursa paverčia juos kortelėmis tame rinkinyje ir aplankuose, kuriems nustatytas šaltinis, – su ta pačia paieška, atsakymais, tikrinimu ir leidimais kaip bet kurio kito šaltinio kortelės.

Kitaip nei tiesioginis kortelių rašymas, pasirinktinis šaltinis seka, ką išsiuntėte. Visiškos sinchronizacijos pabaigoje Sursa archyvuoja kiekvieną dokumentą, kurio neišsiuntėte, todėl ištrynimai jūsų sistemoje pasiekia Sursą be papildomo darbo.

Šaltinio nustatymas

Administratorius sukuria šaltinį Sursoje, skiltyje Sources → New source → Custom source (šaltiniai, naujas šaltinis, pasirinktinis šaltinis), ir pasirenka:

  • rinkinį ir, jei reikia, aplanką jo kortelėms;
  • aplankų režimą: visos kortelės pasirinktame aplanke arba poaplankiai, atkartojantys kiekvieno dokumento path;
  • leidimus: rinkinio leidimai arba „kaip šaltinyje“ – tada kiekvienas dokumentas nurodo, kas gali jį matyti.

Šaltinio puslapyje rodomas jo ID; pavyzdžiuose naudojamas 42.

Rakto pasirinkimas

RaktasPrasidedaGali
Šaltinio raktaskbsrc_Rašyti dokumentus į šį vieną šaltinį. Nieko daugiau: jis negali skaityti ar ieškoti. Sukurkite jį šaltinio puslapio skiltyje API keys.
Organizacijos raktas su apimtimi import:writekb_Rašyti į bet kurį organizacijos pasirinktinį šaltinį ir skaityti jo būseną. Šaltiniui ir jo raktams sukurti reikia apimties admin.

Šaltinio raktas – saugiausias pasirinkimas vienai integracijai, ypač tokiai, kuri veikia trečiosios šalies platformoje. Organizacijos raktas su import:write tinka paslaugai, kuri pildo kelis šaltinius.

Abu raktai siunčiami vienodai, o visos push operacijos yra po /v1/push/sources/{source_id}. Raktą ir šaltinio būseną patikrinkite operacija 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}

Dokumentas

LaukasPrivalomasAprašas
external_idtaipJūsų pastovus dokumento ID, iki 512 simbolių. Vėl išsiuntus tą patį ID, dokumentas pakeičiamas.
titletaipKortelės pavadinimas, iki 500 simbolių. Failui pagal numatytuosius nustatymus – failo vardas.
contenttaip, nebent yra failasIki 5 MB.
content_typenehtml (numatytasis), markdown arba text. Iš HTML pašalinami scenarijai, stiliai, formos ir įterptieji objektai.
urlneNuoroda į dokumentą jūsų sistemoje, rodoma kortelėje.
pathneAplankai – masyvas (["Support", "Billing"]) arba eilutė ("Support/Billing"), iki 10 lygių.
permissionsne{"everyone": true} arba {"emails": [...], "groups": [...]}. Naudojama, kai šaltinio leidimai nustatyti „kaip šaltinyje“.
tagsneIki 50 žymų, pridedamų prie šaltinio žymų.
author_emailneJei tai organizacijos naudotojas, jis tampa atsakingu už kortelę asmeniu.
updated_atneKada dokumentas pasikeitė jūsų sistemoje (RFC 3339).
metadataneJūsų rakto ir reikšmės poros kortelėje. Žr. Metaduomenys.
categoryneKortelės kategorija: organizacijos kategorijos raktas.
verifiers, verify_interval_daysneKas tikrina kortelę (naudotojai pagal el. paštą ir grupės) ir kaip dažnai, dienomis.
upload_idneDokumento failas iš įkėlimo dalimis, vietoj content.
attachmentsneIki 20 papildomų dokumento failų – upload_id sąrašas. Kiekvienas tampa atskira šaltinio kortele.

Vietoj content vienas dokumentas multipart/form-data užklausoje gali perduoti iki 100 MB failą: failas – dalyje file, aukščiau nurodyti laukai JSON formatu – dalyje document. Įkėlimai dalimis, skirti upload_id ir attachments, kuriami su organizacijos raktu, turinčiu apimtį import:write, ir paskirtimi import_attachment; šaltinio raktas jų sukurti negali.

Du siuntimo būdai

Tiesioginiai atnaujinimai tinka sistemoms, kurios praneša apie kiekvieną pakeitimą, pavyzdžiui, jūsų pagalbos tarnybos sistemos webhook pranešimas ar žingsnis Zapier platformoje. Siųskite dokumentą, kai jis sukuriamas ar pakeičiamas, ir ištrinkite, kai jis pašalinamas:

UžklausaKą daro
POST /v1/push/sources/{source_id}/documentsSukuria arba pakeičia vieną dokumentą.
POST /v1/push/sources/{source_id}/documents/batchSukuria arba pakeičia daug dokumentų iš karto.
DELETE /v1/push/sources/{source_id}/documents/{external_id}Pašalina vieną dokumentą. ID koduokite URL kodavimu.

Pakeitimai tampa kortelėmis maždaug per minutę; keli pakeitimai iš eilės apdorojami kartu.

Sinchronizacijos tinka reguliariems eksportams: siunčiate viską arba viską, kas pasikeitė, o Sursa suderina. Toliau ši instrukcija aprašo sinchronizacijas.

Visiška sinchronizacija

Sinchronizacija turi tris žingsnius: atidaryti, siųsti, uždaryti.

1. Atidarykite

POST /v1/push/sources/{source_id}/syncs atidaro sinchronizaciją ir grąžina jos numerį:

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}
  • type yra initial pirmajai šaltinio sinchronizacijai ir incremental, kai jau yra užbaigta sinchronizacija. incremental sinchronizacija prieš bet kurią užbaigtą grąžina sources.push_initial_required.
  • Vienu metu gali būti atidaryta tik viena sinchronizacija: antroji grąžina 409 sources.push_sync_open.
  • Sinchronizacija lieka atidaryta max_minutes (numatytoji reikšmė – 60, daugiausia 1440). Po to jos galiojimas baigiasi: niekas nearchyvuojama, o jos numeris nebepriimamas. Pasirinkite laiką, gerokai ilgesnį už jūsų eksporto trukmę.

2. Siųskite dokumentus

Siųskite dokumentus partijomis iki 500, su sinchronizacijos numeriu. Partijos turinys – iki 50 MiB; failai partijoje perduodami kaip 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"}}
    ]
  }'

Atsake pateikiamas kiekvieno dokumento rezultatas ta tvarka, kuria juos išsiuntėte:

{
  "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…"}
  ]
}
LaukasReikšmė
resultKas dabar nutiko dokumentui: created, updated, unchanged, deleted, not_found, error arba skipped (nepritaikytoje atominėje partijoje).
statusKuriame kelio į kortelę etape yra dokumentas: pending, processing (kortelė įrašyta ir indeksuojama), indexed, failed arba removed.
card_idDokumento kortelė, kai ji jau sukurta.
versionTurinio ir laukų maišos reikšmė. Tas pats dokumentas, išsiųstas dar kartą, turi tą pačią versiją ir yra unchanged.
error, reasonKodėl dokumentas nepavyko. reason – pastovus kodas: content_invalid, file_rejected, too_large, limit_reached, index_failed arba batch_rejected (nepavyko kitas atominės partijos dokumentas).

Pagal numatytuosius nustatymus kiekvienas partijos dokumentas taikomas atskirai: vienas blogas dokumentas nesustabdo kitų.

Dokumentų, kurie nuo paskutinės sinchronizacijos nepasikeitė, siųsti iš naujo nereikia. Patvirtinkite juos pagal ID operacija POST /v1/push/sources/{source_id}/syncs/{sync_number}/touch, iki 1000 ID vienoje užklausoje, kad visiškas suderinimas juos išsaugotų:

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. Uždarykite

POST /v1/push/sources/{source_id}/syncs/{sync_number}/close užbaigia sinchronizaciją:

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"}'
statusPoveikis
completeVisiškas suderinimas. Kiekvienas šaltinio dokumentas, kuris šioje sinchronizacijoje nebuvo nei išsiųstas, nei patvirtintas, archyvuojamas. Naudokite tik tada, kai išsiuntėte viską.
complete_incrementalPritaiko tai, ką išsiuntėte, ir nieko nearchyvuoja.
failedNieko nearchyvuoja ir išsaugo tai, kas jau išsiųsta. Žurnalui pridėkite reason (pavyzdžiui, API_ERROR) ir error_details.

Kai eksportas nutrūksta pusiaukelėje, visada uždarykite su failed: complete po dalinio eksporto archyvuotų kiekvieną dokumentą, kurio nespėjote išsiųsti. Pakartojus tą patį uždarymą, grąžinamas tas pats rezultatas.

Po uždarymo Sursa maždaug per minutę paverčia dokumentus kortelėmis. Šaltinio puslapyje rodoma kiekviena sinchronizacija su išsiųstų ir archyvuotų dokumentų skaičiumi, o GET /v1/push/sources/{source_id}/syncs/{sync_number} grąžina tuos pačius skaitiklius.

Inkrementinės sinchronizacijos

Tarp visiškų sinchronizacijų siųskite tik tai, kas pasikeitė:

  1. Atidarykite su "type": "incremental".
  2. Išsiųskite pasikeitusius dokumentus, o pašalintųjų ID įrašykite į deletes (žr. toliau).
  3. Uždarykite su complete_incremental.

Retkarčiais, pavyzdžiui, kas savaitę, paleiskite visišką sinchronizaciją, kad pagautumėte tai, ką praleido inkrementinis paleidimas.

Dokumentų trynimas partijoje

Partija gali pašalinti dokumentus kartu su tais, kuriuos rašo. Jų ID išvardykite lauke deletes:

{
  "sync_number": 8,
  "documents": [{"external_id": "faq-shipping", "title": "Shipping", "content": "…"}],
  "deletes": ["faq-old-returns", "faq-fax"]
}

Kiekvienas ištrintas ID gauna savo įrašą lauke results su result deleted arba not_found, jei šaltinis tokio dokumento neturi. Ištrinti tą patį ID dar kartą nekenksminga.

Atominės partijos

Kai kurie pakeitimai prasmingi tik kartu, pavyzdžiui, dokumentas ir jį pakeičiantis dokumentas. Siųskite "atomic": true, ir partija bus pritaikyta visa arba visai nepritaikyta: jei kuris nors dokumentas nepraeina patikrų, nieko iš partijos nepritaikoma, o atsakas yra 422 su kodu sources.push_batch_rejected ir kiekvieno dokumento rezultatu lauke error.details.results: nepavykę dokumentai turi error, kiti – skipped.

{"sync_number": 8, "atomic": true, "documents": […], "deletes": ["faq-old-returns"]}

Be atomic partija taikoma dokumentas po dokumento. Atomines partijas naudokite susijusiems pakeitimams, o įprastas partijas – masiniams įkėlimams, kur vienas blogas dokumentas neturėtų sulaikyti kitų.

Kiekvieno dokumento rezultato patikra

Partijos atsakas nurodo, kaip buvo įrašytas kiekvienas dokumentas. Kortele dokumentas tampa vėliau, todėl status dar gali būti pending. Kad rastumėte sinchronizacijos dokumentus, kurie netapo kortelėmis:

curl "https://api.sursa.com/v1/push/sources/42/syncs/7/documents?status=failed" \
  -H "Authorization: Bearer $SURSA_SOURCE_KEY"

Kiekvienas įrašas turi external_id, title, status, card_id, version ir reason, o sąrašas skaidomas puslapiais su cursor. status taip pat priima pending, processing, indexed ir removed.

Užuot klausus, galite gauti pranešimus: įvykiai import.sync_completed (sinchronizacija uždaryta ir apdorota, su suvestiniais skaičiais) ir import.document_failed (dokumentas netapo kortele, su jo reason) ateina webhook pranešimais ir yra įvykių juostoje.

Pakartojimai

  • Su kiekviena POST užklausa siųskite Idempotency-Key. Pakartota partija su tuo pačiu raktu grąžina pirmąjį rezultatą.
  • Net be rakto dokumentas su tuo pačiu external_id niekada netampa antra kortele: jis yra unchanged arba updated.
  • Jei procesas sustoja sinchronizacijos viduryje, atidarykite naują, kai senosios galiojimas baigsis, arba, jei dar turite senosios numerį, uždarykite ją su failed ir paleiskite sinchronizaciją iš naujo.

Limitai

LimitasReikšmė
Vieno dokumento turinys5 MB
Failas vieno dokumento užklausoje100 MB
Dokumentų partijoje500
Partijos užklausos turinys50 MiB
ID vienoje touch užklausoje1000
Dokumentų šaltinyjePriklauso nuo plano: nuo 100 000
Atidaryta sinchronizacijaPagal numatytuosius nustatymus 60 minučių, daugiausia 24 valandos

Dokumentas, viršijantis šaltinio dokumentų limitą, partijoje nepavyksta su priežastimi limit_reached; vieno dokumento užklausa grąžina 409 su kodu sources.push_too_many_documents. Užklausų dažnio limitai taikomi kaip ir bet kuriai kitai užklausai; žr. Užklausų dažnio limitai ir kvotos.

Dažnos klaidos

AtsakasPriežastisKą daryti
401 sources.push_key_invalidRaktas neteisingas, atšauktas arba priklauso kitam šaltiniui.Patikrinkite raktą ir šaltinio ID kelyje.
400 sources.push_document_invalidTrūksta privalomo lauko arba viršytas limitas.Pataisykite dokumentą; įprastoje partijoje nepavyksta tik tas dokumentas.
409 sources.push_sync_openKita sinchronizacija dar atidaryta.Uždarykite ją arba palaukite, kol baigsis jos galiojimas.
409 sources.push_sync_closedSinchronizacija uždaryta arba jos galiojimas baigėsi.Atidarykite naują sinchronizaciją; ilgiems eksportams padidinkite max_minutes.
403 sources.feature_disabledŠaltiniai neįeina į organizacijos planą.Kreipkitės į administratorių.
429Per daug užklausų.Palaukite Retry-After; siųskite mažiau, bet didesnių partijų.