📖 API Reference

← Multi-agent

Base URL: https://aevion-production-a70c.up.railway.app/api/qcoreai · Auth: Authorization: Bearer <JWT> · npm @dosymbek/qcoreai-client

🤖 Core pipeline💬 Sessions🔗 Shared / public📊 Search & analytics📓 Notebook📋 Templates Batch & schedules🧪 Eval harness📝 Prompts library🗂️ Workspaces💰 Spend limits & webhooks⚙️ Health & config

🤖Core pipeline

POST{BASE_URL}/api/qcoreai/multi-agentauth?
Run multi-agent pipeline (SSE stream). Returns events: session, agent_start, chunk, agent_end, verdict, final, cost_tick, sse_end.Body/params: { input, strategy, overrides, maxRevisions, sessionId, maxCostUsd, continueFromRunId, promptOverrides }SSE stream of OrchestratorEvent
POST{BASE_URL}/api/qcoreai/chatauth?
Legacy single-model chat (no agents, no streaming).Body/params: { messages, provider?, model? }{ reply, provider, model }
POST{BASE_URL}/api/qcoreai/runs/:runId/guidancepublic
Inject mid-run human guidance during an active streaming run.Body/params: { text }{ ok }
GET{BASE_URL}/api/qcoreai/runs/:idauth?
Fetch run metadata and all messages.{ run, messages }
GET{BASE_URL}/api/qcoreai/runs/:id/cost-breakdownauth?
Per-agent cost + token breakdown.{ breakdown[], totalCostUsd, byProvider }
GET{BASE_URL}/api/qcoreai/runs/:id/threadauth?
All runs in a conversation thread (root + replies).{ threadId, runs[] }
GET{BASE_URL}/api/qcoreai/runs/:id/exportauth?
Download run as JSON or Markdown.Body/params: ?format=json|mdFile download
POST{BASE_URL}/api/qcoreai/runs/:id/refineauth?
One-pass surgical edit on a finished run.Body/params: { instruction, provider?, model? }{ run, messages }
PATCH{BASE_URL}/api/qcoreai/runs/:id/tagsauth?
Replace run tag list.Body/params: { tags: string[] }{ run }
DELETE{BASE_URL}/api/qcoreai/runs/bulkauth
Bulk delete runs (up to 100, owner-scoped).Body/params: { runIds: string[] }{ deleted: number }
POST{BASE_URL}/api/qcoreai/runs/:id/shareauth?
Generate share token for a run.{ token }
DELETE{BASE_URL}/api/qcoreai/runs/:id/shareauth?
Revoke share token.{ ok }

💬Sessions

GET{BASE_URL}/api/qcoreai/sessionsauth?
List sessions (sorted pinned DESC, updatedAt DESC).{ items[], total, scope }
GET{BASE_URL}/api/qcoreai/sessions/:idauth?
Get a single session.{ session }
PATCH{BASE_URL}/api/qcoreai/sessions/:idauth?
Rename session.Body/params: { title }{ session }
PATCH{BASE_URL}/api/qcoreai/sessions/:id/pinauth?
Pin or unpin a session.Body/params: { pinned: boolean }{ ok, pinned }
DELETE{BASE_URL}/api/qcoreai/sessions/:idauth?
Delete session and all its runs.{ ok }
GET{BASE_URL}/api/qcoreai/sessions/:id/exportauth?
Bulk export all runs in a session.Body/params: ?format=json|mdFile download

🔗Shared / public

GET{BASE_URL}/api/qcoreai/shared/:tokenpublic
Public read-only snapshot of a shared run.{ session, run, messages }
GET{BASE_URL}/api/qcoreai/shared/:token/commentspublic
Public comments on a shared run.{ items[] }
POST{BASE_URL}/api/qcoreai/shared/:token/commentspublic
Post a public comment.Body/params: { authorName?, content }{ comment }

📊Search & analytics

GET{BASE_URL}/api/qcoreai/searchauth?
Full-text + tag search across runs.Body/params: ?q=&limit={ items[] }
GET{BASE_URL}/api/qcoreai/tagsauth?
Top tags for the caller.Body/params: ?limit={ items[] }
GET{BASE_URL}/api/qcoreai/analyticsauth?
KPI summary: runs, sessions, cost, by-strategy, by-provider, by-model, recent.{ ...AnalyticsSummary }
GET{BASE_URL}/api/qcoreai/analytics/timeseriesauth?
Daily cost+run buckets for the last N days.Body/params: ?days=30{ items[]{date,runs,costUsd} }
GET{BASE_URL}/api/qcoreai/analytics/sessionsauth?
Top sessions by cost for a time window.Body/params: ?days=7&limit=10{ items[] }
GET{BASE_URL}/api/qcoreai/analytics/by-tagauth?
Per-tag cost + run breakdown.Body/params: ?limit=20{ items[]{tag,runs,totalCostUsd,avgCostUsd} }
GET{BASE_URL}/api/qcoreai/analytics/exportauth?
CSV download of timeseries data.Body/params: ?days=30CSV file

📓Notebook

POST{BASE_URL}/api/qcoreai/notebookauth
Save a snippet from a run.Body/params: { runId, role?, content, annotation?, tags? }{ snippet }
GET{BASE_URL}/api/qcoreai/notebookauth
List snippets with optional filters.Body/params: ?q=&tag=&pinned=&limit={ items[] }
GET{BASE_URL}/api/qcoreai/notebook/tagsauth
Tag cloud for the caller's notebook.{ items[]{tag,count} }
PATCH{BASE_URL}/api/qcoreai/notebook/:idauth
Update annotation, tags, or pin state.Body/params: { annotation?, tags?, pinned? }{ snippet }
DELETE{BASE_URL}/api/qcoreai/notebook/:idauth
Delete a snippet.{ deleted }

📋Templates

POST{BASE_URL}/api/qcoreai/templatesauth
Create a named template (input + strategy + overrides).Body/params: { name, input, strategy?, overrides?, description?, isPublic? }{ template }
GET{BASE_URL}/api/qcoreai/templatesauth
List own templates.{ items[] }
GET{BASE_URL}/api/qcoreai/templates/publicpublic
Browse public templates (sorted by useCount).Body/params: ?q=&limit={ items[] }
PATCH{BASE_URL}/api/qcoreai/templates/:idauth
Update template.{ template }
DELETE{BASE_URL}/api/qcoreai/templates/:idauth
Delete template.{ deleted }
POST{BASE_URL}/api/qcoreai/templates/:id/useauth?
Apply template (bumps useCount).{ template }

Batch & schedules

POST{BASE_URL}/api/qcoreai/batchauth
Submit N prompts as a batch (max 20, 5 parallel). Returns 202 immediately.Body/params: { inputs[], strategy?, overrides?, maxCostUsd? }{ batchId, totalRuns, runIds[] }
GET{BASE_URL}/api/qcoreai/batchesauth
List user's recent batches.{ items[] }
GET{BASE_URL}/api/qcoreai/batch/:idauth
Batch status + per-run summaries.{ batch, runs[] }
POST{BASE_URL}/api/qcoreai/schedulesauth
Create a recurring or one-shot scheduled batch.Body/params: { name, inputs[], strategy?, schedule?, nextRunAt? }{ schedule }
GET{BASE_URL}/api/qcoreai/schedulesauth
List scheduled batches.{ items[] }
PATCH{BASE_URL}/api/qcoreai/schedules/:idauth
Update schedule (name/inputs/enabled/nextRunAt).{ schedule }
DELETE{BASE_URL}/api/qcoreai/schedules/:idauth
Delete schedule.{ deleted }
POST{BASE_URL}/api/qcoreai/schedules/:id/run-nowauth
Trigger schedule immediately.{ batchId, runIds[] }

🧪Eval harness

POST{BASE_URL}/api/qcoreai/eval/suitesauth
Create an eval suite.Body/params: { name, description?, strategy?, overrides?, cases[] }{ suite }
GET{BASE_URL}/api/qcoreai/eval/suitesauth
List eval suites.{ items[] }
GET{BASE_URL}/api/qcoreai/eval/suites/:idauth
Get a suite.{ suite }
PATCH{BASE_URL}/api/qcoreai/eval/suites/:idauth
Update suite.{ suite }
DELETE{BASE_URL}/api/qcoreai/eval/suites/:idauth
Delete suite.{ deleted }
POST{BASE_URL}/api/qcoreai/eval/suites/:id/runauth
Kick off an eval run (async).{ run }
GET{BASE_URL}/api/qcoreai/eval/runs/:idauth
Poll eval run status + results.{ run }
GET{BASE_URL}/api/qcoreai/eval/suites/:id/runsauth
History of eval runs for a suite.{ items[] }

📝Prompts library

POST{BASE_URL}/api/qcoreai/promptsauth
Create a versioned system prompt.Body/params: { name, content, role?, description?, isPublic?, parentPromptId? }{ prompt }
GET{BASE_URL}/api/qcoreai/promptsauth
List own prompts.{ items[] }
GET{BASE_URL}/api/qcoreai/prompts/publicpublic
Browse public prompts.{ items[] }
GET{BASE_URL}/api/qcoreai/prompts/auditauth
Prompt library audit log.{ items[] }
PATCH{BASE_URL}/api/qcoreai/prompts/:idauth
Update prompt metadata.{ prompt }
DELETE{BASE_URL}/api/qcoreai/prompts/:idauth
Delete prompt version.{ deleted }
POST{BASE_URL}/api/qcoreai/prompts/:id/forkauth
Fork a prompt (own = new version, public = copy to your library).{ prompt }
GET{BASE_URL}/api/qcoreai/prompts/:id/versionsauth?
Version chain for a prompt.{ items[] }

🗂️Workspaces

POST{BASE_URL}/api/qcoreai/workspacesauth
Create a workspace.Body/params: { name, description? }{ workspace }
GET{BASE_URL}/api/qcoreai/workspacesauth
List workspaces (owned or member).{ items[] }
PATCH{BASE_URL}/api/qcoreai/workspaces/:idauth
Rename workspace.{ workspace }
DELETE{BASE_URL}/api/qcoreai/workspaces/:idauth
Delete workspace.{ deleted }
POST{BASE_URL}/api/qcoreai/workspaces/:id/membersauth
Invite a member.Body/params: { userId, role }{ member }
DELETE{BASE_URL}/api/qcoreai/workspaces/:id/members/:userIdauth
Remove member.{ ok }
GET{BASE_URL}/api/qcoreai/workspaces/:id/sessionsauth
Sessions in workspace.{ items[] }
POST{BASE_URL}/api/qcoreai/workspaces/:id/sessionsauth
Add session to workspace.Body/params: { sessionId }{ ok }
DELETE{BASE_URL}/api/qcoreai/workspaces/:id/sessions/:sessionIdauth
Remove session from workspace.{ ok }

💰Spend limits & webhooks

GET{BASE_URL}/api/qcoreai/me/spend-limitauth
Get monthly spend limit.{ limit }
PUT{BASE_URL}/api/qcoreai/me/spend-limitauth
Set monthly spend limit.Body/params: { monthlyLimitUsd, alertAt? }{ limit }
DELETE{BASE_URL}/api/qcoreai/me/spend-limitauth
Remove spend limit.{ ok }
GET{BASE_URL}/api/qcoreai/me/spend-summaryauth
Current month spend vs. limit.{ spentUsd, limitUsd, pct, alerting, exceeded }
GET{BASE_URL}/api/qcoreai/me/webhookauth
Get webhook config.{ webhook }
PUT{BASE_URL}/api/qcoreai/me/webhookauth
Set webhook URL + secret.Body/params: { url, secret? }{ webhook }
DELETE{BASE_URL}/api/qcoreai/me/webhookauth
Remove webhook.{ ok }
POST{BASE_URL}/api/qcoreai/me/webhook/testauth
Send a test run.completed event.{ ok, sentTo }
GET{BASE_URL}/api/qcoreai/me/webhook/logauth
Last 50 webhook delivery attempts.Body/params: ?limit={ items[] }

⚙️Health & config

GET{BASE_URL}/api/qcoreai/healthpublic
Service health: storage, providers, guidance bus, live runs, features, version.{ ok, configuredProviders[], storage, guidanceBus, liveRuns, features[], version }
GET{BASE_URL}/api/qcoreai/providerspublic
Available providers with model lists.{ providers[] }
GET{BASE_URL}/api/qcoreai/pricingpublic
Input/output pricing per 1M tokens.{ table[] }
GET{BASE_URL}/api/qcoreai/agentspublic
Role defaults and strategy list.{ roles[], strategies[] }

🔔Webhook event types

Configure your webhook URL at PUT /me/webhook. All events include the event name in the X-QCore-Event header.

run.started
Fired when a multi-agent run begins.Fields: runId, sessionId, strategy, userInput, startedAt
agent.turn
Fired after each agent finishes.Fields: runId, sessionId, role, stage, model, tokensIn, tokensOut, durationMs, costUsd, contentPreview
run.completed
Fired when a run finishes (done / stopped / error).Fields: runId, sessionId, status, finalContent, totalCostUsd, totalDurationMs, finishedAt
session.created
Fired when a new session is created.Fields: sessionId, userId, title, createdAt
session.archived
Fired when a session is archived or unarchived.Fields: sessionId, archived, archivedAt
annotation.created
Fired when an annotation is added to a run message.Fields: annotationId, runId, userId, note, color, createdAt