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
pathsetiap 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
| Kunci | Diawali | Dapat melakukan |
|---|---|---|
| Kunci sumber | kbsrc_ | 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:write | kb_ | 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
| Field | Wajib | Deskripsi |
|---|---|---|
external_id | ya | ID dokumen Anda yang stabil, hingga 512 karakter. Mengirim ID yang sama lagi akan mengganti dokumen. |
title | ya | Judul kartu, hingga 500 karakter. Untuk file, secara default nama file. |
content | ya, kecuali ada file | Hingga 5 MB. |
content_type | tidak | html (default), markdown, atau text. HTML dibersihkan dari skrip, gaya, formulir, dan objek tersemat. |
url | tidak | Tautan ke dokumen di sistem Anda, ditampilkan di kartu. |
path | tidak | Folder, sebagai array (["Support", "Billing"]) atau string ("Support/Billing"), hingga 10 tingkat. |
permissions | tidak | {"everyone": true}, atau {"emails": [...], "groups": [...]}. Dipakai saat izin sumber diatur “seperti di sumber”. |
tags | tidak | Hingga 50 tag, ditambahkan ke tag sumber. |
author_email | tidak | Jika ini pengguna organisasi, pengguna itu menjadi penanggung jawab kartu. |
updated_at | tidak | Kapan dokumen berubah di sistem Anda (RFC 3339). |
metadata | tidak | Pasangan kunci-nilai milik Anda pada kartu. Lihat Metadata. |
category | tidak | Kategori kartu: kunci salah satu kategori organisasi. |
verifiers, verify_interval_days | tidak | Siapa yang memverifikasi kartu (pengguna menurut email dan grup) dan seberapa sering, dalam hari. |
upload_id | tidak | File dokumen dari unggahan per bagian, sebagai pengganti content. |
attachments | tidak | Hingga 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:
| Permintaan | Fungsinya |
|---|---|
POST /v1/push/sources/{source_id}/documents | Membuat atau mengganti satu dokumen. |
POST /v1/push/sources/{source_id}/documents/batch | Membuat 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}
typebernilaiinitialuntuk sinkronisasi pertama sumber, danincrementalsetelah ada sinkronisasi yang selesai. Sinkronisasiincrementalsebelum ada yang selesai mengembalikansources.push_initial_required.- Hanya satu sinkronisasi yang dapat terbuka pada satu waktu: sinkronisasi kedua mengembalikan
409sources.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…"}
]
}
| Field | Artinya |
|---|---|
result | Apa yang terjadi pada dokumen saat ini: created, updated, unchanged, deleted, not_found, error, atau skipped (dalam batch atomik yang tidak diterapkan). |
status | Posisi dokumen dalam perjalanannya menjadi kartu: pending, processing (kartu sudah ditulis dan sedang diindeks), indexed, failed, atau removed. |
card_id | Kartu dokumen, setelah kartu itu ada. |
version | Hash dari konten dan field. Dokumen yang sama yang dikirim lagi memiliki versi yang sama dan bernilai unchanged. |
error, reason | Mengapa 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"}'status | Efek |
|---|---|
complete | Rekonsiliasi penuh. Setiap dokumen sumber yang tidak dikirim maupun dikonfirmasi dalam sinkronisasi ini diarsipkan. Pakai hanya jika Anda mengirim semuanya. |
complete_incremental | Menerapkan apa yang Anda kirim dan tidak mengarsipkan apa pun. |
failed | Tidak 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:
- Buka dengan
"type": "incremental". - Kirim dokumen yang berubah, dan masukkan ID dokumen yang dihapus ke
deletes(lihat di bawah). - 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-Keybersama setiapPOST. Batch yang diulang dengan kunci yang sama mengembalikan hasil pertama. - Bahkan tanpa kunci itu, dokumen dengan
external_idyang sama tidak pernah menjadi kartu kedua: dokumen itu bernilaiunchangedatauupdated. - Jika proses berhenti di tengah sinkronisasi, buka sinkronisasi baru setelah yang lama kedaluwarsa, atau tutup yang
lama dengan
failedjika Anda masih memiliki nomornya, lalu jalankan sinkronisasi lagi.
Batas
| Batas | Nilai |
|---|---|
| Konten satu dokumen | 5 MB |
| File dalam permintaan satu dokumen | 100 MB |
| Dokumen per batch | 500 |
| Isi permintaan batch | 50 MiB |
ID per permintaan touch | 1.000 |
| Dokumen per sumber | Bergantung pada paket: mulai dari 100.000 |
| Sinkronisasi terbuka | Secara 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
| Jawaban | Penyebab | Yang perlu dilakukan |
|---|---|---|
401 sources.push_key_invalid | Kunci salah, sudah dicabut, atau milik sumber lain. | Periksa kunci dan ID sumber di path. |
400 sources.push_document_invalid | Field wajib tidak ada atau batas terlampaui. | Perbaiki dokumen; dalam batch biasa, hanya dokumen itu yang gagal. |
409 sources.push_sync_open | Sinkronisasi lain masih terbuka. | Tutup sinkronisasi itu, atau tunggu hingga kedaluwarsa. |
409 sources.push_sync_closed | Sinkronisasi sudah ditutup atau kedaluwarsa. | Buka sinkronisasi baru; naikkan max_minutes untuk ekspor yang panjang. |
403 sources.feature_disabled | Sumber bukan bagian dari paket organisasi. | Hubungi administrator. |
429 | Terlalu banyak permintaan. | Tunggu selama Retry-After; kirim batch yang lebih sedikit tetapi lebih besar. |