Chat about the import (server-sent events)
const url = 'https://api.sloose.com/ai/chat';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"sessionId":"example","message":"example","columns":["example"],"sampleRows":[{"additionalProperty":"example"}],"enabledModules":["example"]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.sloose.com/ai/chat \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "sessionId": "example", "message": "example", "columns": [ "example" ], "sampleRows": [ { "additionalProperty": "example" } ], "enabledModules": [ "example" ] }'A conversational turn with tools: read the schema, propose a mapping, test an expression, explain a problem.
The response is a text/event-stream, not JSON. Events arrive in this order:
| Event | Meaning |
|---|---|
session |
{ sessionId, requestId } — send sessionId back to continue this conversation. |
| (tool events) | One per tool call and result, as the turn proceeds. |
done |
{ sessionId, requestId, credits, usage, model, turns } — the turn finished and the meter is settled. |
error |
{ code, error } — the turn failed; the reservation is released. |
A turn that fails part-way still emits error rather than closing silently, so a client never has to guess.
Fields the org has annotated as personal data are masked before any sample leaves the server, and an org whose AI sample policy is deny sends no rows at all.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Continue an existing chat. Omit to start one.
One source row: column name → cell value, always as a string.
object
Examplegenerated
{ "sessionId": "example", "message": "example", "columns": [ "example" ], "sampleRows": [ { "additionalProperty": "example" } ], "enabledModules": [ "example" ]}Responses
Section titled “Responses”The event stream. See the table above for the event sequence.
Server-sent events.
The body did not match the schema (BAD_INPUT, with issues), or a named module or field does not exist.
object
Examplegenerated
{ "error": "example", "code": "example"}No bearer, or one that is expired, revoked or no longer resolves to a member.
The error envelope every non-2xx answer uses.
object
Human-readable explanation.
Machine-readable reason. Absent on a few legacy 400s.
Examplegenerated
{ "error": "example", "code": "example"}Not enough AI credits, or the org is suspended. balance shows what is left.
object
AI credits. Included credits reset each period; purchased ones do not.
object
Included + purchased − reserved
Examplegenerated
{ "error": "example", "code": "example", "balance": { "included": 1, "purchased": 1, "reserved": 1, "available": 1, "periodStart": "example", "periodEnd": "example" }}That chat session belongs to somebody else.
object
Example
{ "code": "SESSION_FORBIDDEN"}No such org.
object
Example
{ "code": "ORG_NOT_FOUND"}The org has no module registry yet — run discovery and enable some modules first.
object
Example
{ "code": "ORG_NOT_CONFIGURED"}The model declined. category says why.
object
Example
{ "code": "AI_REFUSED"}The model’s answer could not be used.
object
Example
{ "code": "AI_BAD_OUTPUT"}AI is not configured on this deployment. Unconfigured paths say so rather than failing.
object
Example
{ "code": "AI_NOT_CONFIGURED"}