All documentation

HTTP API reference

Endpoints for searching, asking a question, managing sources, uploading documents and reading instance information. The same API serves Proxyma Desktop, the Home Server and Proxyma Enterprise Server. Authentication differs, the token endpoints exist only on Proxyma Enterprise Server, and the upload endpoints only on the Home Server and Proxyma Enterprise Server.

Replace the host in every example

Examples use https://your-proxyma-host. For Proxyma Desktop use http://localhost:4246; for the Home Server and Proxyma Enterprise Server use the address of its web interface.

Before you start

Authentication

Proxyma Desktop and the Home Server have no accounts. Every endpoint below answers an unauthenticated call, so keep them reachable only from a machine or network you control - see the Home Server guide.

Proxyma Enterprise Server has accounts. Without a token, search and chat (where guest chat is enabled) see shared sources only, and the source, upload and token endpoints return 401. Send a token to include your own sources:

-H "Authorization: Bearer <your-token>"

A token has the permissions of the account that created it and never more.

Getting a token

On Proxyma Enterprise Server, create one in Settings → API Tokens, or over the API with the session token of a signed-in browser (its PROXYMA-TOKEN cookie). An MCP token cannot create tokens.

curl -X POST https://your-proxyma-host/api/v1/settings/mcp-tokens \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <your-session-token>" \
  -d '{"label": "ci-pipeline"}'

The raw token is pxm_ followed by 64 hex characters and is returned once, at creation, in the token field. Add "expiresInDays" of 30, 60, 90 or 180 to make it expire. A lost token cannot be recovered - revoke it and create another. GET the same path to list tokens (only their first few characters are shown), and DELETE /api/v1/settings/mcp-tokens/{id} to revoke one.

One token for MCP and HTTP

An MCP token also works as a bearer token on the search, chat and source endpoints on this page. The token and upload endpoints refuse it and need a signed-in session. There is no separate API key.

Errors

400 for a malformed body or a value the server rejects, 401 when a call needs a session it does not have, 403 when your role or license tier does not allow the call, 404 for an unknown id, 429 when a rate limit or quota is reached. Another user's source answers 400, not 403. A failure body is usually JSON with a detail or error field, and is sometimes empty.

Unknown fields in a request body are ignored, not rejected. A misspelled parameter returns 200 and the default is used.

Returns matching passages with their sources, using the same keyword and vector search as chat. It sends the query to your embedding provider, and to a model as well when query expansion or reranking is on, but writes no answer - so it costs far less than asking a question.

POST /api/v1/search

FieldTypeDefaultDescription
querystringrequiredThe search text.
topKnumber10Maximum results to return. Must be positive.
minScorenumber0.3Minimum similarity for vector matches, up to 1. Must be greater than 0. Keyword matches are not filtered by it.

Example

curl -X POST https://your-proxyma-host/api/v1/search \
  -H "Content-Type: application/json" \
  -d '{"query": "authentication flow", "topK": 5, "minScore": 0.4}'

Response

{
  "query": "authentication flow",
  "totalResults": 2,
  "results": [
    {
      "id": "a3f1c2e4-...",
      "title": "Authentication design",
      "snippet": "The auth module handles JWT...",
      "sourceUrl": "https://confluence.example.com/display/PROJ/auth-design",
      "connectorType": "confluence",
      "score": 0.87
    }
  ]
}
FieldDescription
idThe matched passage. A document with several matching passages returns several results.
titleWhat the source calls the document - a page heading, an issue summary, a file name. Null if the document has since been deleted at the source.
snippetThe first 300 characters of the passage.
sourceUrlWhere the document came from. A file name for file-based sources, never a server path.
connectorTypeThe kind of source, for example confluence or local_folder.
scoreRelevance from 0 to 1, comparable across results in the same response.

Asking a question

Returns an answer produced by the agent. It is billed by the instance's AI provider and takes as long as the model takes.

The answer is asynchronous

POST /api/v1/chat returns 200 with a conversation id immediately, before the answer exists. The answer arrives on a separate server-sent events stream.

POST /api/v1/chat

FieldTypeDescription
messagestringThe question.
conversationIdstringContinue an existing conversation. Omit to start one; the id is in the response.
mentionsstring[]Names of sources the agent should search first for this message.
skillMentionsstring[]Skills to load for this message.
attachmentsstring[]The fileName returned for each file uploaded to POST /api/v1/chat/conversations/{conversationId}/attachments. GET on the url it also returns downloads the file.
curl -X POST https://your-proxyma-host/api/v1/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "Which open bugs mention the trap handler?"}'

{"conversationId": "7c9e6679-..."}

GET /api/v1/chat/events/{conversationId}

A text/event-stream carrying the turn as it runs. Open it after posting the message: it replays the turn from its first event, and a stream opened before the post receives nothing from that turn. A keepalive comment is sent every 15 seconds.

Every event is named chat, and its data is JSON with type, callId, toolName, data and parentCallId. type is one of:

TypeMeaning
textA piece of the answer. Concatenate them in order.
tool-startThe agent called toolName; data holds the arguments.
tool-resultThe call callId finished; data holds the result.
tool-approval-requestA change is waiting for approval.
tool-enable-requestA change needs Write turned on first.
titleThe conversation's generated title.
usageThe conversation's token counts so far.
condense-start, condense-endOlder messages are being condensed.
guardrailA guardrail acted on this turn.
retryThe turn is being retried.
errorThe turn failed; data says why.
session-expiredThe session lapsed; sign in again.
doneThe turn is finished. Nothing further arrives for it.
curl -N https://your-proxyma-host/api/v1/chat/events/7c9e6679-...

Sources

A source is one indexed item - a folder, a Jira project, a website, a Confluence space. Source endpoints are under /api/v1/indexing.

GET /api/v1/indexing/summary

Totals plus a capped preview of each type. On Proxyma Enterprise Server, add ?includeShared=true to count shared sources as well as your own.

curl https://your-proxyma-host/api/v1/indexing/summary

{
  "totalSources": 12,
  "totalDocs": 3480,
  "activeIndexingCount": 0,
  "byType": {
    "confluence": { "total": 3, "preview": [ ... ] }
  }
}

activeIndexingCount counts documents being downloaded, converted or embedded right now.

GET /api/v1/indexing/by-type/{type}

Sources of one type - files, webpage, jira, confluence, bitbucket, svn, networkshare, sharepoint, teams, teamschat, outlook, or all. Add ?q= to filter by name. Results come a page at a time: pass page and size (at most 100).

POST /api/v1/indexing/{id}/sync

Start a sync now. Returns {"started": true}, or false if a sync is already running; a second one is not queued. A manual sync is always a full sync, so it also picks up upstream deletions - unless it finds fewer than half the items the source had, in which case nothing is removed.

POST /api/v1/indexing/{id}/reindex

Rebuild the source from scratch. Use it after changing the embedding model; a plain sync keeps existing vectors. The source stays searchable during the rebuild. After a model change on Proxyma Desktop or the Home Server, the old index is kept until the new one is complete.

GET /api/v1/indexing/{id}/items

The documents in one source that are not being processed right now, with their indexing status, up to size (at most 200) at a time. Failed documents come first, then the most recently updated; pass the returned nextCursorFailed, nextCursorTouched and nextCursorId back as cursorFailed, cursorTouched and cursorId for the next page. /items/active returns those being processed now. /items/{documentId}/reindex re-indexes one document, answering 409 if it is being processed at that moment. Only the source's owner may call it. /items/{documentId}/preview returns {"chunks": [...]}, the indexed text search sees.

Changing and removing

CallEffect
PATCH /api/v1/indexing/{id}/configChange what it covers - a folder's file types and subfolders, a site's crawl limits - and index it again. On Proxyma Desktop, path points a folder that was moved or renamed at where it is now.
PATCH /api/v1/indexing/{id}/priorityIndex it ahead of your other sources. Setting it takes priority away from whichever of your sources held it.
PATCH /api/v1/indexing/{id}/graphTurn knowledge-graph extraction on or off for it.
PATCH /api/v1/indexing/{id}/sharedProxyma Enterprise Server: share it with everyone, or stop.
POST /api/v1/indexing/{id}/retry-failedRetry only the documents that failed.
DELETE /api/v1/indexing/{id}Remove the source and its index.
On Proxyma Enterprise Server, deleting an uploaded source deletes the files

For uploaded documents, Proxyma's copy is the only copy unless you kept the originals. On the Home Server the uploaded files stay until you delete them with DELETE /api/v1/files/{fileId}. Deleting a folder-backed source removes only the index.

Uploading documents

Add documents to the Home Server and Proxyma Enterprise Server by upload. Then register a folder of uploads as a source with POST /api/v1/files/folders/register and a body of {"folder": "policies"}.

POST /api/v1/files

multipart/form-data. 200 MB per file.

PartRequiredDescription
fileyesThe file itself.
foldernoFolder to place it in.
relativePathnoPath within an uploaded folder tree, to keep the directory structure.
curl -X POST https://your-proxyma-host/api/v1/files \
  -F "file=@handbook.pdf" \
  -F "folder=policies"

{
  "id": "b12f...",
  "originalName": "handbook.pdf",
  "mimeType": "application/pdf",
  "sizeBytes": 481923,
  "uploadedAt": "2026-09-13T10:04:11Z"
}

Listing, quota and deleting

CallEffect
GET /api/v1/filesEverything you have uploaded.
GET /api/v1/files/quotausedBytes and quotaBytes. Without a quota, quotaBytes is effectively unlimited.
GET /api/v1/files/foldersThe folders you have created.
POST /api/v1/files/check-duplicatesCheck before uploading whether these files are already here.
DELETE /api/v1/files/{fileId}Delete an uploaded file.

Instance information

GET /api/v1/health

Whether the instance is up, and what it is. Needs no authentication, returns nothing sensitive, and is the endpoint to point a monitor at.

curl https://your-proxyma-host/api/v1/health

{
  "status": "ok",
  "edition": "Desktop",
  "version": "0.33.0",
  "platform": "windows",
  "uptimeSeconds": 92,
  "uptime": "1m 32s"
}
FieldMeaning
statusok if the application answered at all.
editionDesktop, Home Server or Enterprise Server.
versionThe running version.
platformwindows, macos or linux.
uptimeSecondsSeconds since the application started.
uptimeThe same figure written for a person to read.

These six fields are the whole response and are meant to stay that way, so a check written against it keeps working.

GET /api/v1/config

How the web interface is configured: branding, which features this deployment offers, and how documents get in. Needs no authentication and returns nothing sensitive.

It is not the health check - use GET /api/v1/health for that. This one carries whatever the interface needs and changes shape as the interface does.

curl https://your-proxyma-host/api/v1/config

{
  "version": "0.33.0",
  "serverPort": 4246,
  "platform": "linux",
  "orgMode": false,
  "orgCredentialConfigured": false,
  "branding": { "productName": "Proxyma", "faviconUrl": "/favicon.svg" },
  "fileUpload": true,
  "homeServer": false
}
FieldMeaning
versionThe running version.
platformwindows, macos or linux.
fileUploadWhether documents are added by uploading rather than by naming a folder.
homeServerWhether this is the Home Server.

orgMode and orgCredentialConfigured are not in use, and orgMode does not tell you whether a deployment has accounts.

MCP

To let an AI assistant search your sources itself, use the Model Context Protocol server instead. See MCP setup for Claude Code, GitHub Copilot and other clients.