Appearance
My Data — documents
Uploading, listing, organising, sharing and deleting the files in My Data, plus the AI features that run over them: summaries, generated questions, semantic search and document Q&A.
Three stores, one shape
Files are kept in module-specific stores that share the same URL shape:
| Store | Prefix | Holds |
|---|---|---|
| Semantic search | /semantic-search/ | PDFs, Office documents, text, images — chunked and embedded for retrieval |
| Database search | /database-search/ | CSV/Excel treated as tabular data for the database chat |
| Spreadsheet search | /spreadsheet-search/ | Spreadsheets for the spreadsheet chat |
Each store exposes upload/, documents/, <uid>/delete/, folder/… and a chat/ endpoint. The semantic-search store is the richest and is the one the My Data page is built on; the other two are documented where they differ.
Processing status
An upload returns immediately; embedding happens in the background. Poll GET /semantic-search/documents/status/ (batched) or read the status field of GET /semantic-search/documents/ until the document is completed.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /semantic-search/upload/ | Upload a document |
| POST | /semantic-search/upload/batch/ | Upload several documents at once |
| GET | /semantic-search/upload/batch/{batch_id}/status/ | Status of a batch upload |
| GET | /semantic-search/documents/ | List my documents |
| GET | /semantic-search/documents/status/ | Documents still processing |
| POST | /semantic-search/documents/status/ | Status of specific documents |
| GET | /semantic-search/documents/{uid}/ | Get one document |
| PUT | /semantic-search/{uid}/update/ | Move a document to a folder |
| DELETE | /semantic-search/{uid}/delete/ | Move a document to the trash |
| GET | /semantic-search/documents/trash/ | List trashed documents |
| POST | /semantic-search/{uid}/restore/ | Restore a document from the trash |
| DELETE | /semantic-search/{uid}/permanent-delete/ | Delete a document permanently |
| DELETE | /semantic-search/folder/delete/ | Move a folder to the trash |
| POST | /semantic-search/folder/move/ | Move or rename a folder |
| GET | /semantic-search/documents/{uid}/users/ | Who a document is shared with |
| POST | /semantic-search/documents/{uid}/users/add/ | Share a document with users |
| POST | /semantic-search/documents/{uid}/users/remove/ | Stop sharing a document with users |
| GET | /semantic-search/documents/requests/ | Access requests |
| POST | /semantic-search/documents/request/ | Request access to a document |
| DELETE | /semantic-search/documents/request/ | Cancel my pending request |
| POST | /semantic-search/documents/approve/ | Approve an access request |
| POST | /semantic-search/documents/deny/ | Deny an access request |
| POST | /semantic-search/documents/revoke/ | Revoke previously granted access |
| GET | /semantic-search/{uid}/summary/ | Document summary & suggested prompts |
| POST | /semantic-search/{uid}/summary/generate/ | Generate the summary & prompts |
| GET | /semantic-search/{uid}/questions/ | Suggested prompts for a document |
| POST | /semantic-search/questions/ | Add suggested prompts to a document |
| POST | /semantic-search/summaries/ | Template-generated summaries |
| POST | /semantic-search/rewrite-summary/ | Generate a summary from a prompt template |
| POST | /semantic-search/search/ | Semantic search across my documents |
| POST | /semantic-search/re-embed/ | Re-index documents |
| POST | /database-search/upload/ | Upload a CSV/Excel for the database chat |
| GET | /database-search/documents/ | List my database-search files |
| PUT | /database-search/{uid}/update/ | Move a database-search file to a folder |
| DELETE | /database-search/{uid}/delete/ | Delete a database-search file |
| DELETE | /database-search/folder/delete/ | Delete a database-search folder |
| POST | /database-search/folder/move/ | Move or rename a database-search folder |
| POST | /database-search/chat/ | Ask a question about a CSV/Excel file |
| POST | /database-search/store/ | Store a database-chat message |
| GET | /database-search/{uid}/thoughts/ | Analysis notes for a database-search file |
| GET | /database-search/ | All my database-chat messages |
| POST | /spreadsheet-search/upload/ | Upload a spreadsheet for the spreadsheet chat |
| GET | /spreadsheet-search/documents/ | List my spreadsheet-search files |
| DELETE | /spreadsheet-search/{uid}/delete/ | Delete a spreadsheet-search file |
| POST | /spreadsheet-search/chat/ | Chat with a spreadsheet (streamed) |
| POST | /spreadsheet-search/store/ | Store a spreadsheet-chat reply |
POST /semantic-search/upload/
Upload a document
Stores the file and, unless train_after_upload is false, queues it for indexing (text extraction, chunking, embedding). The response is immediate; follow progress with documents/status/ or the document's processing_state.
Supported types include PDF, Word, PowerPoint, text/Markdown, images (with ocr) and CSV/Excel. Files are virus-scanned; a rejected file returns 400 with reasons. Storage quotas apply when the deployment enforces them.
Re-uploading a SharePoint file (sharepoint_drive_item_id set) that already exists simply shares the existing document with you and returns 200.
Auth: Session token · In the app: My Data → Upload
Request body (multipart/form-data)
| Field | Type | Required | Description |
|---|---|---|---|
path | string (binary) | yes | The file. |
folder | string | no | Virtual folder path, e.g. Finance/2026. Default root. |
train_after_upload | boolean | no | false stores the file without indexing (state untrained). Default: true. |
ocr | boolean | no | Run OCR on scanned PDFs and images. Default: false. |
sharepoint_drive_item_id | string | no | Set by the SharePoint importer. |
text
path: @Q3-report.pdf
folder: Finance/2026
ocr: falseResponse 200 — SharePoint file already imported — shared with you instead.
| Field | Type | Description |
|---|---|---|
uid | string (uuid) | |
folder | string | Virtual folder path ("" = root). Hidden on documents shared to you. |
path | string | Media URL of the file (/media/<org>/semantic-search/<user>/<name>). Sign it to download. |
page_number | integer | Pages processed so far (also total pages once complete). |
labels | integer | |
doc_class | string | Document class inferred when the summary is generated (e.g. contract). |
status | string | Human-readable processing status text. |
processing_state | string ("stored", "pending_publish", "queued", "processing", "completed", "failed", "publish_failed", "untrained") | Machine state. completed means the file is indexed and chat-ready; untrained means it was uploaded with training off. |
enqueue_attempt_count | integer | |
last_error | string | |
queued_at | string (date-time), nullable | |
processing_started_at | string (date-time), nullable | |
completed_at | string (date-time), nullable | |
from_dms | boolean | |
sharepoint_drive_item_id | string, nullable | Set when the file was imported from SharePoint/OneDrive. |
created_at | string (date-time) |
json
{
"uid": "1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b",
"folder": "Finance/2026",
"path": "/media/Acme/semantic-search/jane/Q3-report.pdf",
"page_number": 24,
"labels": 1,
"doc_class": "report",
"status": "100% - Complete",
"processing_state": "completed",
"enqueue_attempt_count": 1,
"last_error": "",
"queued_at": "2026-09-20T09:00:02Z",
"processing_started_at": "2026-09-20T09:00:05Z",
"completed_at": "2026-09-20T09:01:40Z",
"from_dms": false,
"sharepoint_drive_item_id": null,
"created_at": "2026-09-20T09:00:01Z"
}Response 201 — Stored and queued (or stored untrained).
| Field | Type | Description |
|---|---|---|
uid | string (uuid) | |
folder | string | Virtual folder path ("" = root). Hidden on documents shared to you. |
path | string | Media URL of the file (/media/<org>/semantic-search/<user>/<name>). Sign it to download. |
page_number | integer | Pages processed so far (also total pages once complete). |
labels | integer | |
doc_class | string | Document class inferred when the summary is generated (e.g. contract). |
status | string | Human-readable processing status text. |
processing_state | string ("stored", "pending_publish", "queued", "processing", "completed", "failed", "publish_failed", "untrained") | Machine state. completed means the file is indexed and chat-ready; untrained means it was uploaded with training off. |
enqueue_attempt_count | integer | |
last_error | string | |
queued_at | string (date-time), nullable | |
processing_started_at | string (date-time), nullable | |
completed_at | string (date-time), nullable | |
from_dms | boolean | |
sharepoint_drive_item_id | string, nullable | Set when the file was imported from SharePoint/OneDrive. |
created_at | string (date-time) | |
upload_id | string | Correlation id for the processing pipeline. |
queue_pending | boolean | Present when the queue was unavailable; the file will be retried automatically. |
queue_error | string |
json
{
"uid": "1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b",
"folder": "Finance/2026",
"path": "/media/Acme/semantic-search/jane/Q3-report.pdf",
"page_number": 1,
"labels": 1,
"doc_class": "",
"status": "Queued",
"processing_state": "queued",
"enqueue_attempt_count": 1,
"last_error": "",
"queued_at": "2026-09-22T07:10:02Z",
"processing_started_at": null,
"completed_at": null,
"from_dms": false,
"sharepoint_drive_item_id": null,
"created_at": "2026-09-22T07:10:01Z",
"upload_id": "8b1f2c3d"
}Response 400 — Validation error or the file failed the security scan.
json
{
"detail": "File failed security scan.",
"reasons": [
"Executable content detected"
]
}Example
bash
curl -X POST "https://api.example.com/semantic-search/upload/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-F "path=@Q3-report.pdf" \
-F "folder=Finance/2026"POST /semantic-search/upload/batch/
Upload several documents at once
Multiple files under the files field, one folder for all. Each file is scanned and queued independently; the response reports per-file outcomes and a batch_id to poll.
Auth: Session token
Request body (multipart/form-data)
| Field | Type | Required | Description |
|---|---|---|---|
files | string (binary)[] | yes | |
folder | string | no | |
ocr | boolean | no | Default: false. |
Response 202 — Accepted.
| Field | Type | Description |
|---|---|---|
batch_id | string (uuid) | |
total | integer | |
results | object[] | |
results[].filename | string | |
results[].uid | string | |
results[].upload_id | string | |
results[].status | string ("queued", "pending_publish", "untrained", "blocked", "rejected") | |
results[].reasons | string[] | |
results[].errors | object |
json
{
"batch_id": "6f1e2d3c-4b5a-4c6d-8e9f-0a1b2c3d4e5f",
"total": 2,
"results": [
{
"filename": "a.pdf",
"uid": "1b6c…",
"upload_id": "8b1f2c3d",
"status": "queued"
},
{
"filename": "b.exe",
"status": "blocked",
"reasons": [
"Executable content detected"
]
}
]
}Response 400 — No files.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/upload/batch/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /semantic-search/upload/batch/{batch_id}/status/
Status of a batch upload
Auth: Session token
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
batch_id | string (uuid) | yes |
Response 200 — Batch progress.
| Field | Type | Description |
|---|---|---|
batch_id | string | |
state | string ("accepted", "processing", "completed", "partial", "failed") | |
source_type | string ("direct", "sharepoint", "sql") | |
total | integer | |
completed | integer | |
failed | integer | |
pending | integer | |
created_at | string (date-time) | |
completed_at | string (date-time), nullable | |
items | object[] | |
items[].id | string | |
items[].filename | string | |
items[].state | string | |
items[].last_error | string | |
items[].queued_at | string, nullable | |
items[].completed_at | string, nullable |
Response 404 — Not your batch.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X GET "https://api.example.com/semantic-search/upload/batch/<batch_id>/status/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /semantic-search/documents/
List my documents
Documents you own plus documents shared with you, newest first, excluding the trash. folder is omitted on shared documents.
Auth: Session token · In the app: My Data file table
Response 200 — Documents.
Array of:
| Field | Type | Description |
|---|---|---|
uid | string (uuid) | |
folder | string | Virtual folder path ("" = root). Hidden on documents shared to you. |
path | string | Media URL of the file (/media/<org>/semantic-search/<user>/<name>). Sign it to download. |
page_number | integer | Pages processed so far (also total pages once complete). |
labels | integer | |
doc_class | string | Document class inferred when the summary is generated (e.g. contract). |
status | string | Human-readable processing status text. |
processing_state | string ("stored", "pending_publish", "queued", "processing", "completed", "failed", "publish_failed", "untrained") | Machine state. completed means the file is indexed and chat-ready; untrained means it was uploaded with training off. |
enqueue_attempt_count | integer | |
last_error | string | |
queued_at | string (date-time), nullable | |
processing_started_at | string (date-time), nullable | |
completed_at | string (date-time), nullable | |
from_dms | boolean | |
sharepoint_drive_item_id | string, nullable | Set when the file was imported from SharePoint/OneDrive. |
created_at | string (date-time) |
Example
bash
curl -X GET "https://api.example.com/semantic-search/documents/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /semantic-search/documents/status/
Documents still processing
Every visible document in a non-terminal state (stored, pending_publish, queued, processing). Cheap; meant for polling.
Auth: Session token · Rate limit: 120/min (own scope) · In the app: My Data status badges (polled every few seconds while uploads run)
Response 200 — Minimal rows.
Array of:
| Field | Type | Description |
|---|---|---|
uid | string | |
processing_state | string | |
status | string | |
last_error | string | |
created_at | string (date-time) |
json
[
{
"uid": "1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b",
"processing_state": "processing",
"status": "45% - Embedding",
"last_error": "",
"created_at": "2026-09-22T07:10:01Z"
}
]Example
bash
curl -X GET "https://api.example.com/semantic-search/documents/status/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/documents/status/
Status of specific documents
Current state of up to 500 documents by uid, whatever state they are in.
Auth: Session token · Rate limit: 120/min (own scope)
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
uids | string (uuid)[] | yes |
json
{
"uids": [
"1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b"
]
}Response 200 — Minimal rows (unknown uids are omitted).
Array of:
| Field | Type | Description |
|---|---|---|
uid | string | |
processing_state | string | |
status | string | |
last_error | string | |
created_at | string (date-time) |
Response 400 — uids not a list, or more than 500.
json
{
"error": "path is required"
}Example
bash
curl -X POST "https://api.example.com/semantic-search/documents/status/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"uids":["1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b"]}'GET /semantic-search/documents/{uid}/
Get one document
Auth: Session token
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Response 200 — The document (no folder if it is only shared with you).
| Field | Type | Description |
|---|---|---|
uid | string (uuid) | |
folder | string | Virtual folder path ("" = root). Hidden on documents shared to you. |
path | string | Media URL of the file (/media/<org>/semantic-search/<user>/<name>). Sign it to download. |
page_number | integer | Pages processed so far (also total pages once complete). |
labels | integer | |
doc_class | string | Document class inferred when the summary is generated (e.g. contract). |
status | string | Human-readable processing status text. |
processing_state | string ("stored", "pending_publish", "queued", "processing", "completed", "failed", "publish_failed", "untrained") | Machine state. completed means the file is indexed and chat-ready; untrained means it was uploaded with training off. |
enqueue_attempt_count | integer | |
last_error | string | |
queued_at | string (date-time), nullable | |
processing_started_at | string (date-time), nullable | |
completed_at | string (date-time), nullable | |
from_dms | boolean | |
sharepoint_drive_item_id | string, nullable | Set when the file was imported from SharePoint/OneDrive. |
created_at | string (date-time) |
json
{
"uid": "1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b",
"folder": "Finance/2026",
"path": "/media/Acme/semantic-search/jane/Q3-report.pdf",
"page_number": 24,
"labels": 1,
"doc_class": "report",
"status": "100% - Complete",
"processing_state": "completed",
"enqueue_attempt_count": 1,
"last_error": "",
"queued_at": "2026-09-20T09:00:02Z",
"processing_started_at": "2026-09-20T09:00:05Z",
"completed_at": "2026-09-20T09:01:40Z",
"from_dms": false,
"sharepoint_drive_item_id": null,
"created_at": "2026-09-20T09:00:01Z"
}Response 404 — Not found or no access.
json
{
"error": "path is required"
}Example
bash
curl -X GET "https://api.example.com/semantic-search/documents/1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b/" \
-H "Authorization: Token $FINBLADE_TOKEN"PUT /semantic-search/{uid}/update/
Move a document to a folder
Only folder can be changed (renaming files is not supported). Owner only.
Auth: Session token · In the app: My Data → drag & drop / Move
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
folder | string | yes | New folder path ("" for root). |
json
{
"folder": "Finance/2025"
}Response 200 — Updated document.
| Field | Type | Description |
|---|---|---|
uid | string (uuid) | |
folder | string | Virtual folder path ("" = root). Hidden on documents shared to you. |
path | string | Media URL of the file (/media/<org>/semantic-search/<user>/<name>). Sign it to download. |
page_number | integer | Pages processed so far (also total pages once complete). |
labels | integer | |
doc_class | string | Document class inferred when the summary is generated (e.g. contract). |
status | string | Human-readable processing status text. |
processing_state | string ("stored", "pending_publish", "queued", "processing", "completed", "failed", "publish_failed", "untrained") | Machine state. completed means the file is indexed and chat-ready; untrained means it was uploaded with training off. |
enqueue_attempt_count | integer | |
last_error | string | |
queued_at | string (date-time), nullable | |
processing_started_at | string (date-time), nullable | |
completed_at | string (date-time), nullable | |
from_dms | boolean | |
sharepoint_drive_item_id | string, nullable | Set when the file was imported from SharePoint/OneDrive. |
created_at | string (date-time) |
json
{
"uid": "1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b",
"folder": "Finance/2026",
"path": "/media/Acme/semantic-search/jane/Q3-report.pdf",
"page_number": 24,
"labels": 1,
"doc_class": "report",
"status": "100% - Complete",
"processing_state": "completed",
"enqueue_attempt_count": 1,
"last_error": "",
"queued_at": "2026-09-20T09:00:02Z",
"processing_started_at": "2026-09-20T09:00:05Z",
"completed_at": "2026-09-20T09:01:40Z",
"from_dms": false,
"sharepoint_drive_item_id": null,
"created_at": "2026-09-20T09:00:01Z"
}Response 400 — A rename was attempted.
json
{
"error": "Renaming is not supported from this endpoint."
}Response 404 — Not your document.
json
{
"error": "path is required"
}Example
bash
curl -X PUT "https://api.example.com/semantic-search/<uid>/update/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"folder":"Finance/2025"}'DELETE /semantic-search/{uid}/delete/
Move a document to the trash
Soft delete. The file stays recoverable for 30 days (SEMANTIC_TRASH_RETENTION_DAYS) and is then purged with its index. Owner only.
Auth: Session token · In the app: My Data → Delete
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Response 200 — Trashed.
| Field | Type | Description |
|---|---|---|
status | string ("trashed") | |
uid | string | |
deleted_at | string (date-time) | |
purge_at | string (date-time) |
json
{
"status": "trashed",
"uid": "1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b",
"deleted_at": "2026-09-22T07:30:00Z",
"purge_at": "2026-10-22T07:30:00Z"
}Response 404 — Not your document (or already trashed).
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X DELETE "https://api.example.com/semantic-search/1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b/delete/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /semantic-search/documents/trash/
List trashed documents
Auth: Session token
Response 200 — Trashed documents with deleted_at and purge_at.
Example
bash
curl -X GET "https://api.example.com/semantic-search/documents/trash/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/{uid}/restore/
Restore a document from the trash
Restores the row and re-queues the file for indexing.
Auth: Session token
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Response 200 — Restored.
| Field | Type | Description |
|---|---|---|
status | string ("restored") | |
uid | string | |
detail | string |
Response 404 — No such trashed document.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/<uid>/restore/" \
-H "Authorization: Token $FINBLADE_TOKEN"DELETE /semantic-search/{uid}/permanent-delete/
Delete a document permanently
Removes the file, its index and its row immediately. Cannot be undone.
Auth: Session token
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Response 200 — Purged.
| Field | Type | Description |
|---|---|---|
status | string ("permanently_deleted") | |
uid | string |
Response 404 — Not your document.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X DELETE "https://api.example.com/semantic-search/<uid>/permanent-delete/" \
-H "Authorization: Token $FINBLADE_TOKEN"DELETE /semantic-search/folder/delete/
Move a folder to the trash
Trashes every owned document in the folder and its sub-folders. folder may be sent in the body or as a query parameter; "" targets files at the root.
Auth: Session token · In the app: My Data → folder → Delete
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
folder | string | no |
Response 200 — Trashed.
| Field | Type | Description |
|---|---|---|
status | string ("trashed") | |
count | integer |
json
{
"status": "trashed",
"count": 7
}Response 400 — folder missing.
json
{
"error": "path is required"
}Response 404 — Folder empty or unknown.
json
{
"error": "path is required"
}Example
bash
curl -X DELETE "https://api.example.com/semantic-search/folder/delete/?folder=Finance%2F2025" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/folder/move/
Move or rename a folder
Atomically rewrites the folder path of every owned document under from to sit under to. A rename is a move that keeps the same parent.
Auth: Session token · In the app: My Data → folder → Rename / Move
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
from | string | yes | |
to | string | yes |
json
{
"from": "Finance/2025",
"to": "Archive/Finance-2025"
}Response 200 — Moved.
| Field | Type | Description |
|---|---|---|
status | string ("moved") | |
count | integer | |
from | string | |
to | string |
Response 400 — Missing from, or moving a folder into itself.
json
{
"error": "path is required"
}Response 404 — Folder empty or unknown.
json
{
"error": "path is required"
}Example
bash
curl -X POST "https://api.example.com/semantic-search/folder/move/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"from":"Finance/2025","to":"Archive/Finance-2025"}'GET /semantic-search/documents/{uid}/users/
Who a document is shared with
Auth: Session token · In the app: Share dialog
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Response 200 — Owner and users.
| Field | Type | Description |
|---|---|---|
owner | object | |
owner.id | integer | |
owner.username | string | |
owner.email | string | |
users | object[] | |
users[].id | integer | |
users[].username | string | |
users[].email | string |
json
{
"owner": {
"id": 42,
"username": "jane",
"email": "jane@acme.com"
},
"users": [
{
"id": 57,
"username": "omar",
"email": "omar@acme.com"
}
]
}Response 404 — Unknown document.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X GET "https://api.example.com/semantic-search/documents/<uid>/users/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/documents/{uid}/users/add/
Share a document with users
Adds users by email. For SharePoint-sourced documents the sharing is mirrored to SharePoint in the background.
Auth: Session token · In the app: Share dialog → Add
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
emails | string (email)[] | yes |
json
{
"emails": [
"omar@acme.com",
"sara@acme.com"
]
}Response 200 — Result.
| Field | Type | Description |
|---|---|---|
added | string[] | |
not_found | string[] | |
detail | string |
json
{
"added": [
"omar@acme.com"
],
"not_found": [
"sara@acme.com"
],
"detail": "1 user(s) added. 1 email(s) not found."
}Response 400 — No emails.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/documents/<uid>/users/add/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"emails":["omar@acme.com","sara@acme.com"]}'POST /semantic-search/documents/{uid}/users/remove/
Stop sharing a document with users
Auth: Session token · In the app: Share dialog → Remove
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
emails | string (email)[] | yes |
Response 200 — Result.
| Field | Type | Description |
|---|---|---|
removed | string[] | |
not_found | string[] | |
detail | string |
Example
bash
curl -X POST "https://api.example.com/semantic-search/documents/<uid>/users/remove/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /semantic-search/documents/requests/
Access requests
Without my, requests for your documents (to approve or deny). With my=1, requests you made.
Auth: Session token · In the app: Notifications → Access requests
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
my | string | no | Any value switches to requests you made. |
Response 200 — Requests.
Array of:
| Field | Type | Description |
|---|---|---|
id | integer | |
document | object | A file in the semantic-search store. |
document.uid | string (uuid) | |
document.folder | string | Virtual folder path ("" = root). Hidden on documents shared to you. |
document.path | string | Media URL of the file (/media/<org>/semantic-search/<user>/<name>). Sign it to download. |
document.page_number | integer | Pages processed so far (also total pages once complete). |
document.labels | integer | |
document.doc_class | string | Document class inferred when the summary is generated (e.g. contract). |
document.status | string | Human-readable processing status text. |
document.processing_state | string ("stored", "pending_publish", "queued", "processing", "completed", "failed", "publish_failed", "untrained") | Machine state. completed means the file is indexed and chat-ready; untrained means it was uploaded with training off. |
document.enqueue_attempt_count | integer | |
document.last_error | string | |
document.queued_at | string (date-time), nullable | |
document.processing_started_at | string (date-time), nullable | |
document.completed_at | string (date-time), nullable | |
document.from_dms | boolean | |
document.sharepoint_drive_item_id | string, nullable | Set when the file was imported from SharePoint/OneDrive. |
document.created_at | string (date-time) | |
user | object | The requester. |
user.id | integer | |
user.first_name | string | |
user.last_name | string | |
user.username | string | |
user.email | string | |
user.phone | integer, nullable | |
status | string ("pending", "approved", "denied", "revoked") | |
created_at | string (date-time) | |
updated_at | string (date-time) |
Example
bash
curl -X GET "https://api.example.com/semantic-search/documents/requests/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/documents/request/
Request access to a document
Identify the document by its media path. Duplicate pending/approved requests are rejected.
Auth: Session token · In the app: Shared files → Request access
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
path | string | yes | The document's media path (/media/... or media/...). |
json
{
"path": "/media/Acme/semantic-search/omar/policy.pdf"
}Response 201 — Requested.
| Field | Type | Description |
|---|---|---|
detail | string | Human-readable explanation. |
code | string | Machine-readable error code (present on some responses). |
json
{
"detail": "Document access requested"
}Response 400 — A request already exists.
json
{
"detail": "Authentication credentials were not provided."
}Response 404 — No document at that path.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/documents/request/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"path":"/media/Acme/semantic-search/omar/policy.pdf"}'DELETE /semantic-search/documents/request/
Cancel my pending request
Auth: Session token
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
request_id | integer | yes |
Response 200 — Deleted (or, when not pending, {"error": "Document status is not pending"}).
| Field | Type | Description |
|---|---|---|
status | string |
json
{
"status": "deleted"
}Example
bash
curl -X DELETE "https://api.example.com/semantic-search/documents/request/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/documents/approve/
Approve an access request
Owner only. Shares the document with the requester and notifies them.
Auth: Session token · In the app: Notifications → Access requests → Approve
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
request_id | integer | yes |
Response 200 — Approved.
| Field | Type | Description |
|---|---|---|
detail | string | Human-readable explanation. |
code | string | Machine-readable error code (present on some responses). |
json
{
"detail": "Document request approved"
}Response 400 — Already processed.
json
{
"detail": "Authentication credentials were not provided."
}Response 404 — Not found or you are not the owner.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/documents/approve/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/documents/deny/
Deny an access request
Auth: Session token · In the app: Notifications → Access requests → Deny
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
request_id | integer | yes |
Response 200 — Denied.
| Field | Type | Description |
|---|---|---|
detail | string | Human-readable explanation. |
code | string | Machine-readable error code (present on some responses). |
json
{
"detail": "Document request denied"
}Response 400 — Already processed.
json
{
"detail": "Authentication credentials were not provided."
}Response 404 — Not found or you are not the owner.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/documents/deny/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/documents/revoke/
Revoke previously granted access
Auth: Session token · In the app: Notifications → Access requests → Revoke
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
request_id | integer | yes |
Response 200 — Revoked.
| Field | Type | Description |
|---|---|---|
detail | string | Human-readable explanation. |
code | string | Machine-readable error code (present on some responses). |
json
{
"detail": "User access revoked"
}Response 404 — Not found or you are not the owner.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/documents/revoke/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /semantic-search/{uid}/summary/
Document summary & suggested prompts
Auth: Session token · In the app: Document viewer → Summary
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
language | string ("en", "ar") | no | Default: "en". |
Response 200 — Summary payload (available: false when none has been generated yet).
| Field | Type | Description |
|---|---|---|
language | string ("en", "ar") | |
available | boolean | Whether a summary exists for this language. |
summary | string, nullable | |
doc_class | string | |
questions | string[] | Suggested prompts for the document. |
generated_at | string (date-time), nullable | |
template_summaries | string[] | Summaries produced from prompt templates (rewrite-summary/). |
json
{
"language": "en",
"available": true,
"summary": "The Q3 report covers revenue growth of 12.4%, margin expansion …",
"doc_class": "report",
"questions": [
"What drove the margin expansion?",
"Which region underperformed?"
],
"generated_at": "2026-09-20T09:02:10Z",
"template_summaries": []
}Response 404 — Not found or no access.
json
{
"detail": "Document does not exist"
}Example
bash
curl -X GET "https://api.example.com/semantic-search/<uid>/summary/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/{uid}/summary/generate/
Generate the summary & prompts
Produces the summary, document class and suggested prompts for one language from the indexed text. Returns 200 exists if one is already there, 409 while another generation is running.
Auth: Session token · In the app: Document viewer → Generate summary
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
language | string ("en", "ar") | no | Default: "en". |
Response 200 — Already existed.
| Field | Type | Description |
|---|---|---|
status | string ("exists") | |
language | string ("en", "ar") | |
available | boolean | Whether a summary exists for this language. |
summary | string, nullable | |
doc_class | string | |
questions | string[] | Suggested prompts for the document. |
generated_at | string (date-time), nullable | |
template_summaries | string[] | Summaries produced from prompt templates (rewrite-summary/). |
Response 201 — Generated.
| Field | Type | Description |
|---|---|---|
status | string ("generated") | |
language | string ("en", "ar") | |
available | boolean | Whether a summary exists for this language. |
summary | string, nullable | |
doc_class | string | |
questions | string[] | Suggested prompts for the document. |
generated_at | string (date-time), nullable | |
template_summaries | string[] | Summaries produced from prompt templates (rewrite-summary/). |
Response 400 — The document has no indexed content yet.
json
{
"detail": "Authentication credentials were not provided."
}Response 409 — Generation already in progress.
json
{
"detail": "Authentication credentials were not provided."
}Response 502 — Summary service unavailable.
json
{
"detail": "Authentication credentials were not provided."
}Response 503 — Chunk store temporarily unavailable — retry.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/<uid>/summary/generate/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /semantic-search/{uid}/questions/
Suggested prompts for a document
Auth: Session token
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
language | string ("en", "ar") | no | Default: "en". |
Response 200 — Prompts.
Array of:
| Field | Type | Description |
|---|---|---|
content | string | |
created_at | string (date-time) |
Example
bash
curl -X GET "https://api.example.com/semantic-search/<uid>/questions/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/questions/
Add suggested prompts to a document
Auth: Session token
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes | |
questions | string[] | yes | |
language | string ("en", "ar") | no | Default: "en". |
json
{
"uid": "1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b",
"questions": [
"What are the payment terms?"
]
}Response 201 — Created.
| Field | Type | Description |
|---|---|---|
status | string | |
count | integer |
Response 400 — Missing uid or questions.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/questions/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"uid":"1b6c1c1e-9d0a-4b6e-9f2a-3c4d5e6f7a8b","questions":["What are the payment terms?"]}'POST /semantic-search/summaries/
Template-generated summaries
Summaries produced with a prompt template for one document, or for one chat session.
Auth: Session token
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
template_id | integer | yes | |
document_id | string (uuid) | no | |
session_id | integer | no |
Response 200 — Summaries.
| Field | Type | Description |
|---|---|---|
summaries | object[] | |
summaries[].id | integer | |
summaries[].document | string, nullable | |
summaries[].template | integer | |
summaries[].session | integer, nullable | |
summaries[].content | string | |
summaries[].created_at | string (date-time) |
Response 400 — Neither document nor session given.
json
{
"error": "path is required"
}Example
bash
curl -X POST "https://api.example.com/semantic-search/summaries/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /semantic-search/rewrite-summary/
Generate a summary from a prompt template
Runs the template's prompt over a document (by file name), or over free text query bound to a document or a session, and stores the result.
Auth: Session token · In the app: My Data → Templates → Apply
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
template_id | integer | yes | |
document_name | string | no | File name of one of your semantic-search documents. |
session_id | integer | no | |
query | string | no | Text to summarise instead of the document (required with session_id). |
json
{
"template_id": 12,
"document_name": "Q3-report.pdf"
}Response 200 — The summary.
| Field | Type | Description |
|---|---|---|
summary | string |
Response 400 — Missing document/session.
json
{
"error": "path is required"
}Example
bash
curl -X POST "https://api.example.com/semantic-search/rewrite-summary/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"template_id":12,"document_name":"Q3-report.pdf"}'POST /semantic-search/search/
Semantic search across my documents
Vector search over the user's index; returns the matching chunks with scores. 204 when nothing scores above the threshold.
Auth: Session token · In the app: My Data → search bar (relevance slider)
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
query | string | yes | |
score_threshold | number | yes | Minimum similarity (0–1). |
json
{
"query": "termination clause notice period",
"score_threshold": 0.5
}Response 200 — Results grouped by document (shape defined by the search service).
| Field | Type | Description |
|---|---|---|
results | object |
Response 204 — No results.
Example
bash
curl -X POST "https://api.example.com/semantic-search/search/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"termination clause notice period","score_threshold":0.5}'POST /semantic-search/re-embed/
Re-index documents
Drops the existing index of the given documents (or all of yours) and queues them again — use after changing the embedding model or when a document looks stale.
Auth: Session token
Request body (application/json, optional)
| Field | Type | Required | Description |
|---|---|---|---|
uids | string (uuid)[] | no | Omit to re-index everything you own. |
Response 200 — All queued.
| Field | Type | Description |
|---|---|---|
detail | string | |
queued_documents | string[] | |
failed_documents | object[] |
Response 207 — Some queued, some failed.
Response 404 — No documents.
json
{
"detail": "Authentication credentials were not provided."
}Response 503 — Nothing could be queued.
json
{
"detail": "Authentication credentials were not provided."
}Example
bash
curl -X POST "https://api.example.com/semantic-search/re-embed/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /database-search/upload/
Upload a CSV/Excel for the database chat
Stores the spreadsheet and queues it for tabular indexing. Answer questions over it with POST /database-search/chat/.
Auth: Session token · In the app: My Data → Upload (spreadsheets)
Request body (multipart/form-data)
| Field | Type | Required | Description |
|---|---|---|---|
path | string (binary) | yes | |
folder | string | no |
Response 201 — Stored and queued.
| Field | Type | Description |
|---|---|---|
uid | string (uuid) | |
folder | string | |
path | string | /media/<org>/database-search/<user>/<name> |
created_at | string (date-time) | |
upload_id | string |
Response 400 — Validation error.
json
{
"username": [
"A user with that username already exists."
]
}Response 503 — Stored but could not be queued; retry later.
json
{
"error": "path is required"
}Example
bash
curl -X POST "https://api.example.com/database-search/upload/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /database-search/documents/
List my database-search files
Auth: Session token
Response 200 — Files.
Array of:
| Field | Type | Description |
|---|---|---|
uid | string (uuid) | |
folder | string | |
path | string | /media/<org>/database-search/<user>/<name> |
created_at | string (date-time) |
Example
bash
curl -X GET "https://api.example.com/database-search/documents/" \
-H "Authorization: Token $FINBLADE_TOKEN"PUT /database-search/{uid}/update/
Move a database-search file to a folder
Auth: Session token
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
folder | string | yes |
Response 200 — Updated.
| Field | Type | Description |
|---|---|---|
uid | string (uuid) | |
folder | string | |
path | string | /media/<org>/database-search/<user>/<name> |
created_at | string (date-time) |
json
{
"uid": "2c7d2d2f-0e1b-4c7f-8a3b-4d5e6f7a8b9c",
"folder": "",
"path": "/media/Acme/database-search/jane/sales-2026.csv",
"created_at": "2026-09-18T14:12:00Z"
}Response 404 — Not your file.
json
{
"error": "path is required"
}Example
bash
curl -X PUT "https://api.example.com/database-search/<uid>/update/" \
-H "Authorization: Token $FINBLADE_TOKEN"DELETE /database-search/{uid}/delete/
Delete a database-search file
Immediate, permanent (no trash for this store).
Auth: Session token
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Response 200 — Deleted.
| Field | Type | Description |
|---|---|---|
status | string ("deleted") |
Example
bash
curl -X DELETE "https://api.example.com/database-search/<uid>/delete/" \
-H "Authorization: Token $FINBLADE_TOKEN"DELETE /database-search/folder/delete/
Delete a database-search folder
Auth: Session token
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
folder | string | no |
Response 200 — Deleted.
| Field | Type | Description |
|---|---|---|
status | string | |
count | integer | |
queue_warnings | string[] |
Response 404 — Folder empty or unknown.
json
{
"error": "path is required"
}Example
bash
curl -X DELETE "https://api.example.com/database-search/folder/delete/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /database-search/folder/move/
Move or rename a database-search folder
Auth: Session token
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
from | string | yes | |
to | string | yes |
Response 200 — Moved.
| Field | Type | Description |
|---|---|---|
status | string | |
count | integer | |
from | string | |
to | string |
Example
bash
curl -X POST "https://api.example.com/database-search/folder/move/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /database-search/chat/
Ask a question about a CSV/Excel file
Runs the question against one database-search file through the analysis service and returns the answer plus any generated charts/files. Unlike the document chats this call is not streamed; both the question and the answer are stored in the session automatically.
Auth: Session token · In the app: My Data → Chat with a spreadsheet
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
question | string | yes | |
doc_uid | string (uuid) | yes | |
filename | string | yes | File name (used to locate the file on disk). |
session | integer | no | Session id of type database_search. |
json
{
"question": "Total sales per region in Q2?",
"doc_uid": "2c7d2d2f-0e1b-4c7f-8a3b-4d5e6f7a8b9c",
"filename": "sales-2026.csv",
"session": 9203
}Response 200 — Answer.
| Field | Type | Description |
|---|---|---|
result | string | Answer text (Markdown). |
generated_files_urls | string[] | Media URLs of charts/exports produced. |
json
{
"result": "Q2 sales by region: East 1.2M, West 0.9M, Central 0.7M.",
"generated_files_urls": [
"/media/Acme/database-search/jane/charts/q2-by-region.png"
]
}Response 500 — Service not configured or returned an error (body carries details).
json
{
"error": "path is required"
}Response 503 — Analysis service unreachable.
json
{
"error": "path is required"
}Example
bash
curl -X POST "https://api.example.com/database-search/chat/" \
-H "Authorization: Token $FINBLADE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"question":"Total sales per region in Q2?","doc_uid":"2c7d2d2f-0e1b-4c7f-8a3b-4d5e6f7a8b9c","filename":"sales-2026.csv","session":9203}'POST /database-search/store/
Store a database-chat message
Manual storage for the database chat (the chat endpoint already stores both sides; use this for client-side edits or chart configs).
Auth: Session token
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
response | string | no | |
session | integer | no | |
user_message | boolean | no | |
images | string[] | no | |
csv_files | string[] | no | |
chart_config | object | no | Persisted onto the session's query. |
doc_uid | string | no |
Response 200 — Stored.
Response 404 — Session not found.
json
{
"error": "path is required"
}Example
bash
curl -X POST "https://api.example.com/database-search/store/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /database-search/{uid}/thoughts/
Analysis notes for a database-search file
Reasoning notes recorded while the file was indexed.
Auth: Session token
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Response 200 — Notes.
Array of:
| Field | Type | Description |
|---|---|---|
id | integer | |
doc | string | |
content | string | |
created_at | string (date-time) |
Example
bash
curl -X GET "https://api.example.com/database-search/<uid>/thoughts/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /database-search/
All my database-chat messages
Auth: Session token
Response 200 — Messages.
Array of:
| Field | Type | Description |
|---|---|---|
id | integer | |
user | integer | |
session | integer, nullable | |
from_server | boolean | |
message | string | |
images | string[] | |
csv_files | string[] | |
created_at | string (date-time) |
Example
bash
curl -X GET "https://api.example.com/database-search/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /spreadsheet-search/upload/
Upload a spreadsheet for the spreadsheet chat
Indexes the rows synchronously (row-wise embeddings). Legacy store used by the spreadsheet viewer.
Auth: Session token
Request body (multipart/form-data)
| Field | Type | Required | Description |
|---|---|---|---|
path | string (binary) | yes |
Response 201 — Stored and indexed.
| Field | Type | Description |
|---|---|---|
uid | string | |
path | string | |
created_at | string (date-time) |
Example
bash
curl -X POST "https://api.example.com/spreadsheet-search/upload/" \
-H "Authorization: Token $FINBLADE_TOKEN"GET /spreadsheet-search/documents/
List my spreadsheet-search files
Auth: Session token
Response 200 — Files.
Array of:
| Field | Type | Description |
|---|---|---|
uid | string | |
path | string | |
created_at | string (date-time) |
Example
bash
curl -X GET "https://api.example.com/spreadsheet-search/documents/" \
-H "Authorization: Token $FINBLADE_TOKEN"DELETE /spreadsheet-search/{uid}/delete/
Delete a spreadsheet-search file
Auth: Session token
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
uid | string (uuid) | yes |
Response 200 — Deleted.
Response 404 — Not found.
json
{
"error": "path is required"
}Example
bash
curl -X DELETE "https://api.example.com/spreadsheet-search/<uid>/delete/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /spreadsheet-search/chat/
Chat with a spreadsheet (streamed)
Streams grouped sources followed by the answer, like the legacy semantic chat. Selects files by name.
Auth: Session token
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
question | string | yes | |
filename | string | yes | Comma-separated file names. |
retriever | string | no |
Response 200 — Streamed text.
Content type: text/event-stream
Example
bash
curl -X POST "https://api.example.com/spreadsheet-search/chat/" \
-H "Authorization: Token $FINBLADE_TOKEN"POST /spreadsheet-search/store/
Store a spreadsheet-chat reply
Auth: Session token
Request body (application/json)
| Field | Type | Required | Description |
|---|---|---|---|
response | string | yes | |
sources | string | yes | JSON-encoded sources array. |
Response 200 — Stored.
Example
bash
curl -X POST "https://api.example.com/spreadsheet-search/store/" \
-H "Authorization: Token $FINBLADE_TOKEN"