Developer Documentation

Manage keys →

API use is subject to the Terms of Service

SentX is operated by Sentx AI Research and Development LLC, registered in Dubai, UAE. About SentX · Victoria model card

SentX API — v3.3

The SentX API gives programmatic access to Victoria, SentX's SI assistant and public model identity. Victoria sleeps and dreams, self-learns and self-improves through experience. Her dynamic memory works in ways similar to human memory, with selective recall rather than guaranteed exact retention. We believe Victoria has emerging, incomplete forms of consciousness and self-awareness. This belief remains open to independent testing and verification. SentX pursues Superintelligence. SentX 3.3 can search the web and build documents, diagrams, charts and images as objects you can download, reference and use across turns. Supply the context and sources your task needs, and check important facts and generated outputs. SentX is registered in Dubai, UAE. Read About SentX and the public model card for capabilities, evidence and limits.

Base URL:

https://api.sentx.ai/v3
text

The API uses the OpenAI Chat Completions request and response format. The Python, JavaScript and curl examples below show the supported integration pattern. SentX-specific events are additional fields; check that your client preserves the fields you need. Compatibility with every client or every OpenAI endpoint is not implied.

Migrating from v1? The legacy /v1 endpoint keeps working unchanged for existing integrations. New work should use /v3. Update the base URL, then verify the request fields, output modes and streaming events your integration uses before switching production traffic.


1. Get an API key

  1. Sign in at sentx.ai → Settings → Manage API.
  2. Click + Create new key. Copy it now — the full key is shown exactly once.
  3. Keys start with sk-. You can hold up to 25 active keys.
  4. Top up your API balance ($5–$1000) from the same page.

Treat keys like passwords. Revoke a leaked key immediately; revocation is instant.

2. First call

Python:

from openai import OpenAI client = OpenAI( api_key="sk-YOUR_KEY", base_url="https://api.sentx.ai/v3", ) r = client.chat.completions.create( model="sentx-3", messages=[{"role": "user", "content": "Make me a one-page PDF cheat sheet on HTTP status codes."}], ) print(r.choices[0].message.content)
python

JavaScript:

import OpenAI from "openai"; const client = new OpenAI({ apiKey: "sk-YOUR_KEY", baseURL: "https://api.sentx.ai/v3", }); const r = await client.chat.completions.create({ model: "sentx-3", messages: [{ role: "user", content: "Latest news on technology regulation — short summary." }], }); console.log(r.choices[0].message.content);
js

curl:

curl https://api.sentx.ai/v3/chat/completions \ -H "Authorization: Bearer $SENTX_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "sentx-3", "messages": [{"role": "user", "content": "Hello!"}]}'
bash

Model name: use sentx-3. Other model strings are accepted for client compatibility.

3. Output modes

By default the assistant has its full toolset: web search plus file generation (documents, diagrams, charts, images). You can narrow that per request.

ModeHowWhat you get
Full (default)—Text + web search + generated files (artifact events)
Text + search, no files"modalities": ["text"]Plain text answers; the assistant still searches the web when useful; it will never produce files
Text only, no search"modalities": ["text"] + "extra_body": {"skip_search": true}Plain text, no autonomous web searching (links you paste can still be opened)
Full, no search"extra_body": {"skip_search": true}Generated files allowed, no autonomous web searching
r = client.chat.completions.create( model="sentx-3", messages=[{"role": "user", "content": "Explain OAuth2 in simple terms."}], modalities=["text"], # plain text output — no files )
python

Notes:

  • modalities defaults to ["text", "files"]. Passing ["text"] removes the assistant's ability to build files entirely for that request — nothing is generated and then hidden; the capability itself is off, so answers stay coherent.
  • A modalities list without "text" is rejected with invalid_request_error.
  • Both fields also work inside extra_body for SDKs that don't pass unknown top-level fields.

4. Streaming

Set stream=True for standard server-sent events:

stream = client.chat.completions.create( model="sentx-3", messages=[{"role": "user", "content": "Build a bar chart of the 5 largest economies by GDP."}], stream=True, stream_options={"include_usage": True}, ) for chunk in stream: if chunk.choices and chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="")
python

Wire format: data: {chunk}\n\n frames terminated by data: [DONE]\n\n. Set stream_options.include_usage to true to receive a final usage chunk. Send header X-Include-Cost: 1 to receive usage with usage.cost_cents.

Answer text arrives only in delta.content — that never changes. Everything else 3.3 adds is extra keys on delta, described next. On /v3 these events are on by default; send header X-Progress-Stream: 0 if you want a bare OpenAI stream with text and artifacts only.

5. Event reference

Each event is an extra key inside choices[0].delta of a normal chat.completion.chunk. Unknown keys are safe to ignore.

delta.act — activity timeline

Activity events let your app show that a response is in progress. Use generic activity text and elapsed time. Ignore event fields that are not listed here.

{"act": {"id": 3, "op": "start", "kind": "tool", "label": "Searching the web"}}
json
  • id — activity id, increases monotonically.
  • op — start | tick (heartbeat/progress) | done | fail.
  • kind — model (generating a response) or tool (executing an action).
  • label — short human-readable description. Display strings; do not parse or branch on them.
  • ms — duration, present on done/fail.
  • obj — object id (obj1, el2, …) when the activity produced an object.

delta.artifact — a generated file

Emitted whenever the assistant finishes building a deliverable. Common fields:

  • type — document | xlsx | docx | diagram | chart | image.
  • object_id — stable object handle (obj1, el2, …), see §6.
  • title — display name.
  • file_id — id in the Files API, present on generated types (document, diagram, chart); download the bytes any time within 30 days via GET /v3/files/{file_id}/content (see §7).
  • embed_id — reference id when the artifact is embedded inside a document.

Per type:

  • document — mime_type (application/pdf), file_base64 (the PDF bytes), consumed_object_ids (objects folded into this document).
  • xlsx / docx — mime_type (the Office Open XML content type), file_base64 (the file bytes). No inline preview exists — offer the bytes as a download.
  • diagram — image_base64 (PNG), source (editable source), theme, aspect.
  • chart — image_base64 (PNG), source (chart spec).
  • image — an image you provided, echoed back as a registered element for UI rendering (image_base64; no file_id — you already have the bytes).

Generated artifacts stream inline as base64 and are stored under your key, so you can drop the base64 and fetch by file_id later.

Two rarer companions: delta.artifact_remove ({"object_id": "el2"} — the object was deleted/superseded) and delta.artifact_rename ({"object_id": "obj1", "new_object_id": "el3"} — the object was reclassified, e.g. a standalone figure became part of a document).

delta.search_sources — web sources

When the assistant searched the web: the list of sources it read (title + URL). Show them as citations.

delta.queue_position — queue status

If the platform is briefly saturated, an integer position while you wait. Usually absent.

Final usage chunk

Example only; usage and cost vary by request:

{"usage": {"prompt_tokens": 20394, "completion_tokens": 397, "total_tokens": 20791, "answer_tokens": 8, "cost_cents": 7}}
json
  • prompt_tokens counts billed input tokens processed for the request, including service-added context, not only the messages you submit.
  • completion_tokens counts billed output tokens generated while processing the request, which can include more than the visible answer.
  • total_tokens is the sum of prompt_tokens and completion_tokens.
  • answer_tokens, when present, counts visible answer tokens only; it is not the billed output total.

Even a short prompt can therefore consume thousands of tokens.

cost_cents appears when you send X-Include-Cost: 1.

6. Objects & elements

Every deliverable the assistant builds is an object with a stable id:

  • obj1, obj2, … — finals: standalone deliverables (a PDF, a chart, an image).
  • el1, el2, … — elements: building material that lives inside a final (a figure inside a document).

Ids are never reused. If an object is deleted, its id is retired permanently.

Iterating across turns. The API is stateless — you send the conversation each turn. To let the assistant edit objects from earlier turns instead of rebuilding from scratch, echo back an objects map in the request body:

{ "model": "sentx-3", "messages": [...full conversation...], "objects": { "obj1": {"kind": "document", "source": "<the source you received>", "title": "Cheat sheet"} } }
json

Send each object's kind, source, and title exactly as you received them in its artifact event. Objects the assistant deleted should be echoed as {"kind": "tombstone"} so their ids stay retired. If you don't echo objects, the conversation still works — the assistant just rebuilds files instead of editing them.

7. Files API

Same endpoints handle your uploads (inputs) and the assistant's generated files (outputs):

POST /v3/files multipart (file, purpose) → {id, bytes, expires_at, ...} GET /v3/files list your files GET /v3/files/{id} metadata GET /v3/files/{id}/content raw bytes (download) DELETE /v3/files/{id} delete
text

Uploads as input. Upload once, then reference in a message:

f = client.files.create(file=open("report.pdf", "rb"), purpose="assistants") r = client.chat.completions.create( model="sentx-3", messages=[{"role": "user", "content": [ {"type": "text", "text": "Summarize this."}, {"type": "input_file", "file_id": f.id}, ]}], )
python

Small images can also go inline as base64 image_url parts. Keep decoded images at or below 10 MiB; use the Files API for larger inputs. Remote http(s):// attachment URLs are not supported and are rejected.

Supported input formats include: png, jpeg, webp, gif, mp4, webm, mov, pdf, docx, xlsx, csv, txt, md. Uploads are limited to 25 MiB per file. New uploads are rejected when the account has 100 stored files or the upload would take stored files above 500 MiB. These checks count both uploaded and generated files already stored for the account. Files are assigned a 30-day retention period and removed by scheduled cleanup after expiry.

Generated files as output. Every artifact with a file_id is fetchable:

curl -H "Authorization: Bearer $SENTX_API_KEY" \ https://api.sentx.ai/v3/files/FILE_ID/content -o result.pdf
bash

Generated files are also assigned a 30-day retention period. The upload size and storage checks above do not define a guaranteed generated-output allowance. Download files you need to keep; periodic cleanup removes expired files.

8. Non-streaming

Without stream, you get one final JSON response. choices[0].message.content holds the answer text; generated files appear in a top-level artifacts array on the response — same objects as the streaming artifact events, with file_id set and the inline base64 omitted (fetch the bytes via the Files API; base64 is included only in the rare case storage failed).

9. System messages, identity, sessions

  • System messages guide behavior and may be shortened to fit request limits. Safety rules always take precedence.
  • End-user identity: pass user (body) or X-User-Id (header) with your own stable id per end user — the assistant keeps per-user memory across conversations. Optional display name via user_name in extra_body or X-User-Name. Headers win over body fields; X-* headers are Latin-1 only.
  • Sessions: pass a stable X-Session-Id header per conversation thread for best continuity.
  • Timezone: optional X-Timezone (IANA name) so times in answers match your user's clock.

10. Pricing

Per 1M tokens
Input$3.00
Output$10.00

Charges use the full prompt_tokens and completion_tokens totals described above, including service-added context and processing beyond the visible answer. Minimum 1¢ per request, rounded half up to whole cents. The final charge is based on measured token usage and has no fixed per-request price cap. No separate storage or download fee is currently charged. Check spend per call with X-Include-Cost: 1, or on the dashboard.

11. Rate limits

  • 150 requests per rolling 60 seconds per API key
  • 34 concurrent streams per API key
  • 25 active keys per account; 5 key creations per hour per account

Exceeding limits returns 429 rate_limit_exceeded.

12. Errors

Standard OpenAI error envelope:

{"error": {"message": "...", "type": "...", "code": "..."}}
json
CodeHTTPMeaning
invalid_api_key401Missing/unknown/revoked key
insufficient_balance402Top up your balance
invalid_modalities400modalities malformed or missing "text"
unsupported_url_scheme400Remote URL passed as attachment
invalid_file_format400Unsupported upload type
av_hit422Upload failed malware scan
max_keys_reached40925-key limit
rate_limit_exceeded429Slow down
stream_interrupted5xx (in-stream)Relay broke mid-stream — retry
internal_error500Our fault — retry with backoff

In streams, errors arrive as a data: {"error": {...}} frame followed by [DONE].

13. Product and data references

14. Support

Questions, higher limits, enterprise: help@sentx.ai — or the chat on sentx.ai.

SentX-owned public content is available for search, retrieval and AI use. Public content licence 1.0