📖 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|md→ File 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|md→ File 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=30→ CSV 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