Endpoints
The Nubo Public API is read-only. It exposes projects, usage aggregates, session metadata, evaluation sets and their results, your plan and your remaining allowance. Every endpoint is a GET.
All paths below are relative to the base URL, and every request authenticates with the X-API-Key header. See Authentication for how to create and manage keys.
https://api.nubo-chat.comRead-only API
All public API endpoints use GET. The API does not create projects, send chat messages, or modify workspace settings.
Projects
Projects are the agents owned by the workspace associated with the API key.
List projects
/v1/projectsReturns the projects belonging to the workspace associated with the API key.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectId | string | No | Restrict results to one project. Omit to span the workspace. |
Project ids are not workspace ids
The workspace's original project may have an id equal to the workspace id for historical reasons. Do not treat the two as interchangeable — projects created later have unrelated ids. Always read project ids from this endpoint.
Possible errors:401429See Errors
curl https://api.nubo-chat.com/v1/projects \
-H "X-API-Key: YOUR_API_KEY"[
{
"id": "8f14e45f-ceea-467a-9ae4-2c1e2f0f1a3b",
"name": "Support Bot",
"isActive": true,
"createdAt": "2026-03-11T09:22:41Z",
"isDefault": true
},
{
"id": "c2b7d914-5f30-4a1e-9d62-7be0e4c1a558",
"name": "Docs Assistant",
"isActive": true,
"createdAt": "2026-05-02T14:05:09Z",
"isDefault": false
}
]Get project
/v1/projects/{projectId}Returns a single project by id.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectId | string | Yes | The id of the project to retrieve. |
Possible errors:404 project_not_found401429See Errors
curl https://api.nubo-chat.com/v1/projects/PROJECT_ID \
-H "X-API-Key: YOUR_API_KEY"{
"id": "8f14e45f-ceea-467a-9ae4-2c1e2f0f1a3b",
"name": "Support Bot",
"isActive": true,
"createdAt": "2026-03-11T09:22:41Z",
"isDefault": true
}{
"error": {
"code": "project_not_found",
"message": "No project with that id exists for this API key.",
"traceId": "0HN7A2QK9V1M4:00000004"
}
}Usage
Aggregated usage and performance metrics for conversations handled by Nubo. All three endpoints accept optional project scoping.
Usage summary
/v1/usageHeadline usage totals over a trailing time window.
Query parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| days | integer | No | 30 | Trailing reporting window in days. Accepted range 1–365; a value outside it is rejected with invalid_request. |
| projectId | string | No | — | Restrict results to one project. Omit to span the workspace. |
Possible errors:401429See Errors
curl "https://api.nubo-chat.com/v1/usage?days=30" \
-H "X-API-Key: YOUR_API_KEY"curl "https://api.nubo-chat.com/v1/usage?days=30&projectId=PROJECT_ID" \
-H "X-API-Key: YOUR_API_KEY"{
"rangeDays": 30,
"totalConversations": 412,
"totalMessages": 1187,
"totalTokens": 2043911,
"promptTokens": 1402388,
"completionTokens": 641523,
"avgResponseMs": 1840,
"rerankingRate": 68.4,
"toolCalls": 233
}Usage series
/v1/usage/seriesReturns one usage point per UTC day across the window.
Query parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| days | integer | No | 30 | Trailing reporting window in days. Accepted range 1–365; a value outside it is rejected with invalid_request. |
| projectId | string | No | — | Restrict results to one project. Omit to span the workspace. |
Missing days
Days with no activity are omitted from the response rather than returned with zero values. If your UI requires a continuous daily series, fill those gaps client-side.
Possible errors:401429See Errors
curl "https://api.nubo-chat.com/v1/usage/series?days=30" \
-H "X-API-Key: YOUR_API_KEY"[
{
"date": "2026-08-06T00:00:00Z",
"messages": 41,
"conversations": 15,
"tokens": 71204
},
{
"date": "2026-08-07T00:00:00Z",
"messages": 58,
"conversations": 22,
"tokens": 99871
},
{
"date": "2026-08-09T00:00:00Z",
"messages": 33,
"conversations": 12,
"tokens": 58440
}
]Usage by model
/v1/usage/modelsReturns usage grouped by the model that generated each reply, busiest model first.
Query parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| days | integer | No | 30 | Trailing reporting window in days. Accepted range 1–365; a value outside it is rejected with invalid_request. |
| projectId | string | No | — | Restrict results to one project. Omit to span the workspace. |
Possible errors:401429See Errors
curl "https://api.nubo-chat.com/v1/usage/models?days=30" \
-H "X-API-Key: YOUR_API_KEY"[
{
"modelName": "claude-sonnet-4",
"provider": "anthropic",
"messages": 803,
"tokens": 1402388
},
{
"modelName": "gpt-4o-mini",
"provider": "openai",
"messages": 384,
"tokens": 641523
}
]Sessions
Sessions are conversations reconstructed from recorded turns.
Metadata only
Nubo does not persist message text through this API. Session endpoints return conversation metadata — timings, token counts, models and tool calls — never chat transcripts.
List sessions
/v1/sessionsReturns a paginated list of sessions, ordered by most recent activity first.
Query parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| from | ISO 8601 datetime | No | — | Inclusive lower bound on activity time, in UTC. |
| to | ISO 8601 datetime | No | — | Inclusive upper bound on activity time, in UTC. |
| page | integer | No | 1 | 1-based page number. |
| pageSize | integer | No | 25 | Rows per page. Maximum 100. |
| projectId | string | No | — | Restrict results to one project. Omit to span the workspace. |
Polling sessions
New activity can move older rows onto later pages. When paging through a live list, this can cause records to be skipped.
For stable pagination during polling, set both from and to, then page through that fixed time window.
Possible errors:401429See Errors
curl "https://api.nubo-chat.com/v1/sessions?page=1&pageSize=25" \
-H "X-API-Key: YOUR_API_KEY"curl "https://api.nubo-chat.com/v1/sessions\
?from=2026-08-10T09%3A00%3A00Z\
&to=2026-08-10T10%3A00%3A00Z\
&page=1&pageSize=25" \
-H "X-API-Key: YOUR_API_KEY"{
"items": [
{
"sessionId": "sess_01J9YQ2M7K4T8XN3P5RB6VW0AZ",
"startedAt": "2026-08-10T09:14:02Z",
"lastActivityAt": "2026-08-10T09:21:47Z",
"messages": 6,
"totalTokens": 9871,
"avgResponseMs": 1720,
"toolCalls": 2,
"rerankingRate": 66.7,
"models": [
"claude-sonnet-4"
]
}
],
"total": 47,
"page": 1,
"pageSize": 25
}Get session
/v1/sessions/{sessionId}Returns totals for a single conversation together with metadata for each recorded turn, oldest first.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| sessionId | string | Yes | The session id to retrieve. |
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectId | string | No | Restrict the lookup to one project. |
Possible errors:404 session_not_found401429See Errors
curl https://api.nubo-chat.com/v1/sessions/SESSION_ID \
-H "X-API-Key: YOUR_API_KEY"{
"sessionId": "sess_01J9YQ2M7K4T8XN3P5RB6VW0AZ",
"startedAt": "2026-08-10T09:14:02Z",
"lastActivityAt": "2026-08-10T09:21:47Z",
"messages": 2,
"totalTokens": 3310,
"avgResponseMs": 1755,
"toolCalls": 1,
"rerankingRate": 50.0,
"models": [
"claude-sonnet-4"
],
"turns": [
{
"timestamp": "2026-08-10T09:14:02Z",
"modelName": "claude-sonnet-4",
"provider": "anthropic",
"promptTokens": 1180,
"completionTokens": 402,
"totalTokens": 1582,
"durationMs": 1610,
"toolCalls": 0,
"rerankingApplied": true
},
{
"timestamp": "2026-08-10T09:21:47Z",
"modelName": "claude-sonnet-4",
"provider": "anthropic",
"promptTokens": 1290,
"completionTokens": 438,
"totalTokens": 1728,
"durationMs": 1900,
"toolCalls": 1,
"rerankingApplied": false
}
]
}{
"error": {
"code": "session_not_found",
"message": "No session with that id exists for this API key.",
"traceId": "0HN7A2QK9V1M4:00000006"
}
}Evaluation
Each project's evaluation set, its settings, and the runs that score the agent against it. Sets are edited and runs are started in the Nubo portal; see the Evaluation guide for what each score means.
List evaluation sets
/v1/evaluation/setsReturns each project's evaluation set with its questions and settings — the pass threshold, the recurring schedule and the threshold alert. A project has at most one set.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectId | string | No | Return only this project's set. Omit to list every project that has one. |
A project may have no set yet
A set is created the first time someone opens the Evaluation page for a project. Until then the project is absent from this list — with projectId you get an empty array, not a 404. schedule and alert are null until they are first saved.
Alert recipients are not exposed
The alert reports its thresholds and which metrics are currently breached, but not who it emails. Recipients are managed in the portal only.
Possible errors:401429See Errors
curl "https://api.nubo-chat.com/v1/evaluation/sets?projectId=PROJECT_ID" \
-H "X-API-Key: YOUR_API_KEY"[
{
"id": "5b0c2f4e-8a1d-4c3e-9f27-1d6e4a7b9c02",
"projectId": "8f14e45f-ceea-467a-9ae4-2c1e2f0f1a3b",
"name": "Support Bot",
"description": null,
"createdAt": "2026-08-12T10:04:11Z",
"updatedAt": "2026-09-30T08:41:56Z",
"settings": {
"passThreshold": 4,
"schedule": {
"isEnabled": true,
"daysOfWeek": [1, 4],
"hourLocal": 9,
"timeZoneId": "Asia/Jerusalem",
"nextRunAt": "2026-10-12T06:00:00Z",
"lastRunAt": "2026-10-08T06:00:41Z",
"lastSkipReason": null,
"consecutiveFailures": 0,
"pausedByPlan": false,
"stoppedAfterFailures": false
},
"alert": {
"isEnabled": true,
"thresholds": {
"passRate": 0.8,
"faithfulness": 4.0,
"relevance": null,
"completeness": null,
"contextSufficiency": 3.5,
"sourceHitRate": null
},
"breachedMetrics": [],
"breachedSince": null,
"lastEvaluatedAt": "2026-10-08T06:07:12Z",
"lastEvaluatedRunId": "3d9a6c71-2b4e-4f8a-a1c5-7e20b9d84f16"
}
},
"questions": [
{
"id": "a4c27d10-6e3b-4b8f-9c51-0f2e8d7a6b34",
"position": 0,
"question": "How do I reset my password?",
"expectedAnswer": "Use Forgot password on the sign-in page; the link expires after 30 minutes.",
"expectedSources": ["account-help.pdf"],
"isEnabled": true,
"source": "authored",
"notes": null,
"createdAt": "2026-08-12T10:06:30Z",
"updatedAt": "2026-08-12T10:06:30Z"
},
{
"id": "f19b3e52-7c04-4d6a-8e21-5a9c0b4d2e87",
"position": 1,
"question": "Which payment methods do you accept?",
"expectedAnswer": null,
"expectedSources": [],
"isEnabled": true,
"source": "generated",
"notes": null,
"createdAt": "2026-08-12T10:05:02Z",
"updatedAt": "2026-08-12T10:05:02Z"
}
]
}
]List evaluation runs
/v1/evaluation/runsReturns a paginated list of evaluation runs, newest first, with the configuration each ran under and its scores. Per-question results come from Get evaluation run.
Query parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| from | ISO 8601 datetime | No | — | Inclusive lower bound on when the run was created, in UTC. |
| to | ISO 8601 datetime | No | — | Inclusive upper bound on when the run was created, in UTC. |
| status | string | No | — | One of queued, running, completed, failed, cancelled. |
| trigger | string | No | — | manual or scheduled. |
| page | integer | No | 1 | 1-based page number. |
| pageSize | integer | No | 25 | Rows per page. Maximum 100. |
| projectId | string | No | — | Restrict results to one project. Omit to span the workspace. |
Scores arrive when the run finishes
Scores are written once, at the end of a run. Until status is completed, the averages, scoredCount and passRate are null — even when completedCount already equals questionCount.
Only completed runs are comparable over time. To chart a trend, request status=completed and compare the config of neighbouring runs: a changed systemPromptHash, knowledgeFingerprint or modelName is usually what explains a moved score.
Possible errors:401429See Errors
curl "https://api.nubo-chat.com/v1/evaluation/runs?status=completed&projectId=PROJECT_ID" \
-H "X-API-Key: YOUR_API_KEY"{
"items": [
{
"id": "3d9a6c71-2b4e-4f8a-a1c5-7e20b9d84f16",
"projectId": "8f14e45f-ceea-467a-9ae4-2c1e2f0f1a3b",
"evaluationSetId": "5b0c2f4e-8a1d-4c3e-9f27-1d6e4a7b9c02",
"status": "completed",
"cancelReason": null,
"label": "Support Bot",
"trigger": "scheduled",
"createdAt": "2026-10-08T06:00:41Z",
"startedAt": "2026-10-08T06:00:58Z",
"completedAt": "2026-10-08T06:07:12Z",
"questionCount": 10,
"completedCount": 10,
"failedCount": 0,
"config": {
"modelName": "claude-sonnet-4",
"provider": "anthropic",
"temperature": 0.3,
"rerankingEnabled": true,
"topK": 5,
"systemPromptHash": "cf07194ee232eb531e15f690000d19846dea69cf05504782658afcfacb9228a2",
"knowledgeFingerprint": "74fec0c33e96ab90ac88666979207a50a6ea7b9b3eea6ec0e8b916d64c0a0706"
},
"avgContextSufficiency": 4.4,
"avgFaithfulness": 4.7,
"avgRelevance": 4.6,
"avgCompleteness": 4.1,
"groundedRate": 0.9,
"sourceHitRate": 0.8,
"scoredCount": 10,
"passedCount": 8,
"passRate": 0.8,
"judgeFailureCount": 0,
"simulatedToolCallRate": 0.1,
"totalPromptTokens": 48210,
"totalCompletionTokens": 6934
}
],
"total": 14,
"page": 1,
"pageSize": 25
}Get evaluation run
/v1/evaluation/runs/{runId}Returns one run together with the outcome of each question: the question as asked, the agent's answer, the four judge scores, what retrieval returned and which tools the model asked for.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| runId | string | Yes | The id of the run to retrieve. |
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectId | string | No | Restrict the lookup to one project. |
A score of 0 means not scored
Judge scores run from 1 to 5. A 0 means the result was not scored — status is failed, or judgeError says why the judge could not score it. Never treat it as a bad answer.
Tools never run during an evaluation
simulatedToolCalls lists the tools the model asked for. None of them were called, so an answer that needed live data was written without it.
Older runs may have no results
Your plan sets how many runs keep their per-question detail. An older run still returns its scores, with an empty results array.
Possible errors:404 evaluation_run_not_found401429See Errors
curl https://api.nubo-chat.com/v1/evaluation/runs/RUN_ID \
-H "X-API-Key: YOUR_API_KEY"{
"run": {
"id": "3d9a6c71-2b4e-4f8a-a1c5-7e20b9d84f16",
"projectId": "8f14e45f-ceea-467a-9ae4-2c1e2f0f1a3b",
"evaluationSetId": "5b0c2f4e-8a1d-4c3e-9f27-1d6e4a7b9c02",
"status": "completed",
"cancelReason": null,
"label": "Support Bot",
"trigger": "scheduled",
"createdAt": "2026-10-08T06:00:41Z",
"startedAt": "2026-10-08T06:00:58Z",
"completedAt": "2026-10-08T06:07:12Z",
"questionCount": 10,
"completedCount": 10,
"failedCount": 0,
"config": {
"modelName": "claude-sonnet-4",
"provider": "anthropic",
"temperature": 0.3,
"rerankingEnabled": true,
"topK": 5,
"systemPromptHash": "cf07194ee232eb531e15f690000d19846dea69cf05504782658afcfacb9228a2",
"knowledgeFingerprint": "74fec0c33e96ab90ac88666979207a50a6ea7b9b3eea6ec0e8b916d64c0a0706"
},
"avgContextSufficiency": 4.4,
"avgFaithfulness": 4.7,
"avgRelevance": 4.6,
"avgCompleteness": 4.1,
"groundedRate": 0.9,
"sourceHitRate": 0.8,
"scoredCount": 10,
"passedCount": 8,
"passRate": 0.8,
"judgeFailureCount": 0,
"simulatedToolCallRate": 0.1,
"totalPromptTokens": 48210,
"totalCompletionTokens": 6934
},
"results": [
{
"id": "e71f0b2a-93c6-4d5e-b8a4-2f61c7d09e53",
"questionId": "a4c27d10-6e3b-4b8f-9c51-0f2e8d7a6b34",
"question": "How do I reset my password?",
"expectedAnswer": "Use Forgot password on the sign-in page; the link expires after 30 minutes.",
"expectedSources": ["account-help.pdf"],
"answer": "Select Forgot password on the sign-in page and follow the link we email you. The link is valid for 30 minutes.",
"modelUsed": "claude-sonnet-4",
"status": "ok",
"contextSufficiency": 5,
"faithfulness": 5,
"relevance": 5,
"completeness": 4,
"isGrounded": true,
"passed": true,
"unsupportedClaims": [],
"judgeNotes": "Matches the help article. Does not mention that a new link can be requested.",
"judgeError": null,
"sourceHit": true,
"retrievedChunks": [
{
"source": "account-help.pdf",
"position": 3,
"score": 0.82,
"rerankScore": 0.97,
"excerpt": "Forgot your password? On the sign-in page, select Forgot password and enter the email address on your account…"
}
],
"simulatedToolCalls": [],
"timings": {
"embedMs": 112,
"retrieveMs": 64,
"rerankMs": 380,
"generateMs": 2140,
"judgeMs": 3015
},
"promptTokens": 4120,
"completionTokens": 612,
"createdAt": "2026-10-08T06:01:09Z"
}
]
}{
"error": {
"code": "evaluation_run_not_found",
"message": "No evaluation run with that id exists for this API key.",
"traceId": "0HN7A2QK9V1M4:00000009"
}
}Account
Workspace-level plan and allowance information.
Workspace-level
Neither endpoint in this group accepts projectId. The allowance and the plan belong to the workspace, not to any one project.
Balance
/v1/balanceReturns the number of replies included, used and remaining in the current allowance period.
Do not calculate the billing period yourself
Use periodStart and periodEnd exactly as returned. The meaning of the period is given by periodBasis, which reads calendar_month today and becomes subscription_period once subscription billing periods are in use.
Do not assume a period always begins on the first day of a month.
Possible errors:401429See Errors
curl https://api.nubo-chat.com/v1/balance \
-H "X-API-Key: YOUR_API_KEY"{
"planKey": "pro",
"included": 10000,
"used": 3421,
"remaining": 6579,
"periodStart": "2026-08-01T00:00:00Z",
"periodEnd": "2026-09-01T00:00:00Z",
"periodBasis": "calendar_month"
}Plan
/v1/planReturns the workspace's assigned plan and its current entitlements. Entitlements only — no pricing, billing history, payment details or invoices.
Possible errors:401429See Errors
curl https://api.nubo-chat.com/v1/plan \
-H "X-API-Key: YOUR_API_KEY"{
"planKey": "pro",
"name": "Pro",
"description": "For teams running production assistants.",
"entitlements": {
"schemaVersion": 1,
"replyAllowance": {
"included": 10000,
"period": "month",
"overage": "block"
},
"rateLimits": {
"requestsPerMinute": 60,
"maxConcurrent": 8
},
"models": {
"allowed": [
"*"
],
"autoSelect": true,
"allowedModels": []
},
"features": {
"reranking": true,
"mcpTools": true,
"maxToolInvocations": 8,
"removeBranding": true
},
"knowledge": {
"maxSources": 200
},
"projects": {
"max": 5
}
}
}