Увоз докумената
Овај водич показује како да своје документе унесете у платформу Sursa помоћу API интерфејса за картице: неколико докумената из скрипте или све документе неког система кроз редован посао. Сваки документ постаје картица у колекцији. Људи је проналазе у претрази, асистент одговара на основу ње, а она има власника, ознаке, проверу и дозволе као и свака друга картица.
Ако желите да Sursa сама утврди који су документи обрисани у вашем систему или документе шаљете са платформе за интеграције, уместо тога користите сопствени извор. Он је направљен за потпуне и инкременталне синхронизације. Овај водич обухвата директан упис у колекцију.
Потребан вам је API кључ са опсегом cards:write и улогом која може да уписује у циљну колекцију (editor или
admin). Примери користе помоћну функцију из водича Брзи почетак.
Избор праве операције
| Имате | Користите |
|---|---|
| Запис са стабилним идентификатором у вашем систему | PUT /v1/cards-by-external-id/{external_id}: креирање или замена по вашем идентификатору. |
| Текст који додајете једном, без сопственог идентификатора | POST /v1/cards/text |
| Фајл који додајете једном | POST /v1/cards |
| ZIP архиву са много фајлова | POST /v1/cards/archive |
| Фајл већи од ограничења за један захтев | Отпремање у деловима, а затим било која од горњих операција. |
| Нови садржај за картицу коју већ имате | PUT /v1/cards/{card_id}/content |
За све што увозите више пута користите external_id. Тако је сваки увоз поновљив: поновно покретање ажурира картице
које је креирао уместо да додаје копије.
Креирање или замена картице по вашем идентификатору
PUT /v1/cards-by-external-id/{external_id} прима ID записа у вашем систему. Ако ниједна картица нема овај
external_id, операција креира нову (201). Ако га нека картица има, замењује садржај и детаље те картице (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"}
}'Шта се дешава при понављању:
- Садржај се није променио: не прави се нова верзија. Одговор је
200са"status": "skipped"и"reason": "unchanged". Понављање захтева је увек безбедно, чак и безIdempotency-Key. - Садржај се променио: картица добија нову верзију и поново се индексира. Њен наслов, ознаке, власник, категорија
и
metadataдобијају вредности које сте послали;metadataсе замењује у целини. - Колекција и фолдер примењују се само када се картица креира. Да бисте касније преместили картицу, измените је
помоћу
PATCH /v1/cards/{card_id}.
Нова верзија уклања проверу картице, као и свака измена садржаја: верификатор је поново потврђује.
Формати текста
content_type | Тело је |
|---|---|
markdown (подразумевано) | Markdown. |
html | HTML. Чисти се до једноставних ознака: наслови, пасуси, листе, табеле и линкови http, https и mailto. Скрипте, стилови, оквири, обрасци и слике уклањају се заједно са својим садржајем. |
text | Обичан текст. Пасуси се раздвајају празним редовима. |
Са чекањем на картицу или без њега
Подразумевано се захтев враћа када је картица спремна да буде пронађена, са "status": "ready" и картицом у card.
То траје од делића секунде за кратак текст до минут или више за дугачак фајл.
За масовни увоз пошаљите "async": true. Одговор стиже одмах, са "status": "queued" и послом индексирања у job
(са његовим job_id). Проверите посао помоћу GET /v1/jobs/{job_id} или пратите све
послове у GET /v1/jobs/stream. Посао се завршава са status done, error или canceled.
curl https://api.sursa.com/v1/jobs/48213 \
-H "Authorization: Bearer $SURSA_API_KEY"Отпремање фајла
Фајлови се шаљу у захтеву multipart/form-data, у пољу file. Sursa чита PDF, Word, Excel, PowerPoint, OpenDocument
табеле, CSV, Markdown, HTML, AsciiDoc, имејл (.eml), обичан текст и уобичајене формате слика. Проверава да ли се
име фајла, пријављени тип и садржај слажу, а неслагање одбија са 415.
Да бисте креирали или заменили картицу са фајлом по сопственом идентификатору, пошаљите фајл на исту операцију
PUT /v1/cards-by-external-id/{external_id}:
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"}'У обрасцу је tags стринг са вредностима раздвојеним зарезима, а metadata JSON објекат записан као стринг. Нова
картица без title добија име фајла као наслов.
Да бисте фајл додали једном, без сопственог идентификатора, користите POST /v1/cards
са истим обрасцем и Idempotency-Key. Отпремање фајла који колекција већ има враћа "status": "skipped" са
"duplicate": true и card_id постојеће картице, осим ако проследите external_id.
Величину једног фајла ограничава инсталација (подразумевано 200 MB). За веће фајлове или за непоуздане мреже прво отпремите фајл у деловима.
Замена садржаја картице
Када већ имате идентификатор картице у платформи Sursa, PUT /v1/cards/{card_id}/content
замењује њен текст или фајл и задржава све остало: власника, ознаке, верификаторе, интервал провере и ручно
постављену категорију.
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."}'- Исти садржај поново враћа
"status": "skipped"са"reason": "unchanged". - Картица која се управо индексира враћа
409са кодомcards.indexing_in_progress. Покушајте поново за неколико секунди. - Картица која потиче из извора, на пример из конектора или сопственог извора, мења се само у свом извору:
cards.managed_by_source. - Кључ мора да има право да види целу картицу; делимично видљива картица враћа
cards.content_whole_access.
Увоз много докумената
Петља кроз ваше записе са PUT /v1/cards-by-external-id/… је најједноставнији масовни увоз, а безбедно је можете
зауставити и поново покренути у било ком тренутку. Да би увоз био брз и у складу са ограничењем учесталости:
- Пошаљите
"async": true, како би се сваки захтев вратио чим картица уђе у ред. - Покрените неколико захтева паралелно (од 4 до 8) и успорите када заглавље
RateLimitпокаже да је преостало мало захтева. Погледајте Ограничења учесталости и квоте. - На
429сачекајтеRetry-After; на мрежну грешку или5xxпоновите исти захтев. Понављања не праве штету. - Забележите
external_idсваког записа који се заврши грешком и на крају поново покушајте са тим записима.
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 архиву фајлова POST /v1/cards/archive једним захтевом претвара сваки
подржани фајл у њој у картицу. Одмах одговара планом (који фајлови постају картице, а који се прескачу и зашто) и
послом; GET /v1/archives/{job_id} извештава о резултату.
Проналажење и уклањање увезених картица
- Прочитајте картицу по свом идентификатору помоћу
GET /v1/cards-by-external-id/{external_id}. - Наведите картице једног увоза помоћу филтера метаподатака:
GET /v1/cards?metadata[source]=helpdesk. Погледајте Метаподаци. - Обришите картицу помоћу
DELETE /v1/cards/{card_id}.
Честе грешке
| Код | Узрок | Шта урадити |
|---|---|---|
collections.not_found | Кључу није видљива ниједна колекција са овим идентификатором или именом. | Проверите collection_id помоћу GET /v1/collections. |
collections.no_write_access | Кључ не сме да уписује у ову колекцију. | Користите кључ са улогом editor и приступом колекцији. |
cards.external_id_taken | POST са external_id који већ има друга картица. | Користите PUT /v1/cards-by-external-id/… да бисте је заменили. |
cards.managed_by_source | Картица припада извору. | Измените документ у његовом извору. |
files.type_mismatch | Име, тип и садржај фајла се не слажу. | Пошаљите фајл са његовом стварном екстензијом. |
files.too_large | Фајл прелази ограничење отпремања или простор за складиштење организације. | Користите отпремање у деловима или ослободите простор. |
limits.cards | Организација је достигла ограничење броја картица свог плана. | Обришите картице које више нису потребне или промените план. |
api.metadata_invalid | metadata прекорачује ограничење. | Погледајте Метаподаци. |