Langsung ke konten
Sursa Developers

Menyinkronkan sistem Anda dengan sumber kustom

Sumber kustom menghubungkan sistem yang tidak memiliki konektor bawaan: wiki Anda, alat tiket Anda, basis data, ekspor dari mana pun. Kode Anda mengirim dokumen ke Sursa, dan Sursa mengubahnya menjadi kartu di koleksi dan folder yang diatur untuk sumber itu, dengan pencarian, jawaban, verifikasi, dan izin yang sama seperti kartu dari sumber lain mana pun.

Berbeda dengan menulis kartu secara langsung, sumber kustom mencatat apa yang sudah Anda kirim. Di akhir sinkronisasi penuh, Sursa mengarsipkan setiap dokumen yang tidak Anda kirim, jadi penghapusan di sistem Anda sampai ke Sursa tanpa kerja tambahan.

Menyiapkan sumber

Administrator membuat sumber di Sursa melalui Sources → New source → Custom source (Sumber → Sumber baru → Sumber kustom), lalu memilih:

  • koleksi dan, jika perlu, folder untuk kartu-kartunya;
  • mode folder: semua kartu di folder yang dipilih, atau subfolder yang mencerminkan path setiap dokumen;
  • izin: izin koleksi, atau “seperti di sumber”, saat setiap dokumen mencantumkan siapa yang boleh melihatnya.

Halaman sumber menampilkan ID-nya; contoh-contoh memakai 42.

Memilih kunci

KunciDiawaliDapat melakukan
Kunci sumberkbsrc_Menulis dokumen ke satu sumber ini. Tidak ada yang lain: kunci ini tidak dapat membaca atau mencari. Buat di halaman sumber melalui API keys (kunci API sumber).
Kunci organisasi dengan cakupan import:writekb_Menulis ke sumber kustom mana pun milik organisasi dan membaca statusnya. Membuat sumber dan kuncinya memerlukan cakupan admin.

Kunci sumber adalah pilihan paling aman untuk satu integrasi, terutama integrasi yang berjalan di platform pihak ketiga. Kunci organisasi dengan import:write cocok untuk layanan yang mengisi beberapa sumber.

Kedua kunci dikirim dengan cara yang sama, dan setiap endpoint push berada di bawah /v1/push/sources/{source_id}. Periksa kunci dan keadaan sumber dengan 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}

Dokumen

FieldWajibDeskripsi
external_idyaID dokumen Anda yang stabil, hingga 512 karakter. Mengirim ID yang sama lagi akan mengganti dokumen.
titleyaJudul kartu, hingga 500 karakter. Untuk file, secara default nama file.
contentya, kecuali ada fileHingga 5 MB.
content_typetidakhtml (default), markdown, atau text. HTML dibersihkan dari skrip, gaya, formulir, dan objek tersemat.
urltidakTautan ke dokumen di sistem Anda, ditampilkan di kartu.
pathtidakFolder, sebagai array (["Support", "Billing"]) atau string ("Support/Billing"), hingga 10 tingkat.
permissionstidak{"everyone": true}, atau {"emails": [...], "groups": [...]}. Dipakai saat izin sumber diatur “seperti di sumber”.
tagstidakHingga 50 tag, ditambahkan ke tag sumber.
author_emailtidakJika ini pengguna organisasi, pengguna itu menjadi penanggung jawab kartu.
updated_attidakKapan dokumen berubah di sistem Anda (RFC 3339).
metadatatidakPasangan kunci-nilai milik Anda pada kartu. Lihat Metadata.
categorytidakKategori kartu: kunci salah satu kategori organisasi.
verifiers, verify_interval_daystidakSiapa yang memverifikasi kartu (pengguna menurut email dan grup) dan seberapa sering, dalam hari.
upload_idtidakFile dokumen dari unggahan per bagian, sebagai pengganti content.
attachmentstidakHingga 20 file tambahan dokumen, sebagai daftar upload_id. Masing-masing menjadi kartu tersendiri dari sumber.

Alih-alih content, satu dokumen dapat membawa file hingga 100 MB dalam permintaan multipart/form-data: file di bagian file, field di atas sebagai JSON di bagian document. Unggahan per bagian untuk upload_id dan attachments dibuat dengan kunci organisasi yang memiliki cakupan import:write dan tujuan import_attachment; kunci sumber tidak dapat membuatnya.

Dua cara mengirim

Pembaruan langsung cocok untuk sistem yang memberi tahu Anda tentang setiap perubahan, seperti webhook dari helpdesk Anda atau langkah di Zapier. Kirim dokumen saat dokumen dibuat atau diubah, dan hapus saat dokumen dihilangkan:

PermintaanFungsinya
POST /v1/push/sources/{source_id}/documentsMembuat atau mengganti satu dokumen.
POST /v1/push/sources/{source_id}/documents/batchMembuat atau mengganti banyak dokumen sekaligus.
DELETE /v1/push/sources/{source_id}/documents/{external_id}Menghapus satu dokumen. Lakukan URL-encode pada ID.

Perubahan menjadi kartu dalam waktu sekitar satu menit; beberapa perubahan berturut-turut diproses bersama.

Sinkronisasi cocok untuk ekspor rutin: Anda mengirim semuanya, atau semua yang berubah, dan Sursa melakukan rekonsiliasi. Bagian selanjutnya dari panduan ini membahas sinkronisasi.

Menjalankan sinkronisasi penuh

Sinkronisasi memiliki tiga langkah: buka, kirim, tutup.

1. Buka

POST /v1/push/sources/{source_id}/syncs membuka sinkronisasi dan mengembalikan nomornya:

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 bernilai initial untuk sinkronisasi pertama sumber, dan incremental setelah ada sinkronisasi yang selesai. Sinkronisasi incremental sebelum ada yang selesai mengembalikan sources.push_initial_required.
  • Hanya satu sinkronisasi yang dapat terbuka pada satu waktu: sinkronisasi kedua mengembalikan 409 sources.push_sync_open.
  • Sinkronisasi tetap terbuka selama max_minutes (secara default 60, hingga 1.440). Setelah itu sinkronisasi kedaluwarsa: tidak ada yang diarsipkan dan nomornya tidak lagi diterima. Pilih waktu yang cukup lebih lama daripada durasi ekspor Anda.

2. Kirim dokumen

Kirim dokumen dalam batch berisi hingga 500, dengan nomor sinkronisasi. Isi batch hingga 50 MiB; file di dalam batch diberikan sebagai 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"}}
    ]
  }'

Respons berisi hasil untuk setiap dokumen, dalam urutan Anda mengirimnya:

{
  "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…"}
  ]
}
FieldArtinya
resultApa yang terjadi pada dokumen saat ini: created, updated, unchanged, deleted, not_found, error, atau skipped (dalam batch atomik yang tidak diterapkan).
statusPosisi dokumen dalam perjalanannya menjadi kartu: pending, processing (kartu sudah ditulis dan sedang diindeks), indexed, failed, atau removed.
card_idKartu dokumen, setelah kartu itu ada.
versionHash dari konten dan field. Dokumen yang sama yang dikirim lagi memiliki versi yang sama dan bernilai unchanged.
error, reasonMengapa dokumen gagal. reason adalah kode stabil: content_invalid, file_rejected, too_large, limit_reached, index_failed, atau batch_rejected (dokumen lain dalam batch atomik gagal).

Secara default, setiap dokumen dalam batch diterapkan secara tersendiri: satu dokumen yang buruk tidak menghentikan yang lain.

Dokumen yang tidak berubah sejak sinkronisasi terakhir tidak perlu dikirim lagi. Konfirmasikan dokumen itu menurut ID dengan POST /v1/push/sources/{source_id}/syncs/{sync_number}/touch, hingga 1.000 ID per permintaan, agar rekonsiliasi penuh mempertahankannya:

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. Tutup

POST /v1/push/sources/{source_id}/syncs/{sync_number}/close mengakhiri sinkronisasi:

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"}'
statusEfek
completeRekonsiliasi penuh. Setiap dokumen sumber yang tidak dikirim maupun dikonfirmasi dalam sinkronisasi ini diarsipkan. Pakai hanya jika Anda mengirim semuanya.
complete_incrementalMenerapkan apa yang Anda kirim dan tidak mengarsipkan apa pun.
failedTidak mengarsipkan apa pun dan mempertahankan apa yang sudah dikirim. Tambahkan reason (misalnya API_ERROR) dan error_details untuk log.

Tutup dengan failed setiap kali ekspor Anda berhenti di tengah jalan: complete setelah ekspor yang tidak lengkap akan mengarsipkan setiap dokumen yang belum sempat Anda kirim. Mengulang penutupan yang sama mengembalikan hasil yang sama.

Setelah ditutup, Sursa mengubah dokumen menjadi kartu dalam waktu sekitar satu menit. Halaman sumber menampilkan setiap sinkronisasi beserta jumlah dokumen yang dikirim dan diarsipkan, dan GET /v1/push/sources/{source_id}/syncs/{sync_number} mengembalikan penghitung yang sama.

Sinkronisasi inkremental

Di antara sinkronisasi penuh, kirim hanya yang berubah:

  1. Buka dengan "type": "incremental".
  2. Kirim dokumen yang berubah, dan masukkan ID dokumen yang dihapus ke deletes (lihat di bawah).
  3. Tutup dengan complete_incremental.

Jalankan sinkronisasi penuh dari waktu ke waktu, misalnya setiap minggu, untuk menangkap apa pun yang terlewat oleh eksekusi inkremental.

Menghapus dokumen dalam batch

Batch dapat menghapus dokumen bersamaan dengan dokumen yang ditulisnya. Cantumkan ID-nya di deletes:

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

Setiap ID yang dihapus mendapat entrinya sendiri di results, dengan result bernilai deleted, atau not_found jika sumber tidak memiliki dokumen seperti itu. Menghapus ID yang sama lagi tidak berbahaya.

Batch atomik

Beberapa perubahan hanya masuk akal jika dilakukan bersama, misalnya sebuah dokumen dan dokumen yang menggantikannya. Kirim "atomic": true, dan batch diterapkan sepenuhnya atau tidak sama sekali: jika ada dokumen yang gagal dalam pemeriksaannya, tidak ada bagian batch yang diterapkan, dan responsnya 422 dengan kode sources.push_batch_rejected serta hasil setiap dokumen di error.details.results: dokumen yang gagal memiliki error, yang lain skipped.

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

Tanpa atomic, batch diterapkan dokumen demi dokumen. Pakai batch atomik untuk perubahan yang saling terkait, dan batch biasa untuk muatan massal, ketika satu dokumen yang buruk tidak boleh menahan sisanya.

Memeriksa hasil setiap dokumen

Respons batch memberi tahu Anda bagaimana setiap dokumen ditulis. Pengubahannya menjadi kartu terjadi sesudahnya, jadi status masih dapat bernilai pending. Untuk menemukan dokumen sebuah sinkronisasi yang tidak menjadi kartu:

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

Setiap entri memiliki external_id, title, status, card_id, version, dan reason, dan daftar ini dipaginasi dengan cursor. status juga menerima pending, processing, indexed, dan removed.

Anda juga dapat diberi tahu alih-alih bertanya: peristiwa import.sync_completed (sinkronisasi ditutup dan diproses, beserta totalnya) dan import.document_failed (dokumen tidak menjadi kartu, beserta reason-nya) datang melalui webhook dan di umpan peristiwa.

Percobaan ulang

  • Kirim Idempotency-Key bersama setiap POST. Batch yang diulang dengan kunci yang sama mengembalikan hasil pertama.
  • Bahkan tanpa kunci itu, dokumen dengan external_id yang sama tidak pernah menjadi kartu kedua: dokumen itu bernilai unchanged atau updated.
  • Jika proses berhenti di tengah sinkronisasi, buka sinkronisasi baru setelah yang lama kedaluwarsa, atau tutup yang lama dengan failed jika Anda masih memiliki nomornya, lalu jalankan sinkronisasi lagi.

Batas

BatasNilai
Konten satu dokumen5 MB
File dalam permintaan satu dokumen100 MB
Dokumen per batch500
Isi permintaan batch50 MiB
ID per permintaan touch1.000
Dokumen per sumberBergantung pada paket: mulai dari 100.000
Sinkronisasi terbukaSecara default 60 menit, hingga 24 jam

Dokumen di atas batas dokumen sumber gagal dengan alasan limit_reached dalam batch; permintaan satu dokumen menjawab 409 dengan kode sources.push_too_many_documents. Batas laju berlaku seperti untuk permintaan lainnya; lihat Batas laju dan kuota.

Error yang umum

JawabanPenyebabYang perlu dilakukan
401 sources.push_key_invalidKunci salah, sudah dicabut, atau milik sumber lain.Periksa kunci dan ID sumber di path.
400 sources.push_document_invalidField wajib tidak ada atau batas terlampaui.Perbaiki dokumen; dalam batch biasa, hanya dokumen itu yang gagal.
409 sources.push_sync_openSinkronisasi lain masih terbuka.Tutup sinkronisasi itu, atau tunggu hingga kedaluwarsa.
409 sources.push_sync_closedSinkronisasi sudah ditutup atau kedaluwarsa.Buka sinkronisasi baru; naikkan max_minutes untuk ekspor yang panjang.
403 sources.feature_disabledSumber bukan bagian dari paket organisasi.Hubungi administrator.
429Terlalu banyak permintaan.Tunggu selama Retry-After; kirim batch yang lebih sedikit tetapi lebih besar.