📖 API Reference
← Multi-agentBase 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 OrchestratorEventPOST
{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/guidancepublicInject 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 downloadPOST
{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/bulkauthBulk 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/:tokenpublicPublic read-only snapshot of a shared run.→
{ session, run, messages }GET
{BASE_URL}/api/qcoreai/shared/:token/commentspublicPublic comments on a shared run.→
{ items[] }POST
{BASE_URL}/api/qcoreai/shared/:token/commentspublicPost 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/notebookauthSave a snippet from a run.Body/params:
{ runId, role?, content, annotation?, tags? }→ { snippet }GET
{BASE_URL}/api/qcoreai/notebookauthList snippets with optional filters.Body/params:
?q=&tag=&pinned=&limit=→ { items[] }GET
{BASE_URL}/api/qcoreai/notebook/tagsauthTag cloud for the caller's notebook.→
{ items[]{tag,count} }PATCH
{BASE_URL}/api/qcoreai/notebook/:idauthUpdate annotation, tags, or pin state.Body/params:
{ annotation?, tags?, pinned? }→ { snippet }DELETE
{BASE_URL}/api/qcoreai/notebook/:idauthDelete a snippet.→
{ deleted }📋Templates
POST
{BASE_URL}/api/qcoreai/templatesauthCreate a named template (input + strategy + overrides).Body/params:
{ name, input, strategy?, overrides?, description?, isPublic? }→ { template }GET
{BASE_URL}/api/qcoreai/templatesauthList own templates.→
{ items[] }GET
{BASE_URL}/api/qcoreai/templates/publicpublicBrowse public templates (sorted by useCount).Body/params:
?q=&limit=→ { items[] }PATCH
{BASE_URL}/api/qcoreai/templates/:idauthUpdate template.→
{ template }DELETE
{BASE_URL}/api/qcoreai/templates/:idauthDelete template.→
{ deleted }POST
{BASE_URL}/api/qcoreai/templates/:id/useauth?Apply template (bumps useCount).→
{ template }⚡Batch & schedules
POST
{BASE_URL}/api/qcoreai/batchauthSubmit 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/batchesauthList user's recent batches.→
{ items[] }GET
{BASE_URL}/api/qcoreai/batch/:idauthBatch status + per-run summaries.→
{ batch, runs[] }POST
{BASE_URL}/api/qcoreai/schedulesauthCreate a recurring or one-shot scheduled batch.Body/params:
{ name, inputs[], strategy?, schedule?, nextRunAt? }→ { schedule }GET
{BASE_URL}/api/qcoreai/schedulesauthList scheduled batches.→
{ items[] }PATCH
{BASE_URL}/api/qcoreai/schedules/:idauthUpdate schedule (name/inputs/enabled/nextRunAt).→
{ schedule }DELETE
{BASE_URL}/api/qcoreai/schedules/:idauthDelete schedule.→
{ deleted }POST
{BASE_URL}/api/qcoreai/schedules/:id/run-nowauthTrigger schedule immediately.→
{ batchId, runIds[] }🧪Eval harness
POST
{BASE_URL}/api/qcoreai/eval/suitesauthCreate an eval suite.Body/params:
{ name, description?, strategy?, overrides?, cases[] }→ { suite }GET
{BASE_URL}/api/qcoreai/eval/suitesauthList eval suites.→
{ items[] }GET
{BASE_URL}/api/qcoreai/eval/suites/:idauthGet a suite.→
{ suite }PATCH
{BASE_URL}/api/qcoreai/eval/suites/:idauthUpdate suite.→
{ suite }DELETE
{BASE_URL}/api/qcoreai/eval/suites/:idauthDelete suite.→
{ deleted }POST
{BASE_URL}/api/qcoreai/eval/suites/:id/runauthKick off an eval run (async).→
{ run }GET
{BASE_URL}/api/qcoreai/eval/runs/:idauthPoll eval run status + results.→
{ run }GET
{BASE_URL}/api/qcoreai/eval/suites/:id/runsauthHistory of eval runs for a suite.→
{ items[] }📝Prompts library
POST
{BASE_URL}/api/qcoreai/promptsauthCreate a versioned system prompt.Body/params:
{ name, content, role?, description?, isPublic?, parentPromptId? }→ { prompt }GET
{BASE_URL}/api/qcoreai/promptsauthList own prompts.→
{ items[] }GET
{BASE_URL}/api/qcoreai/prompts/publicpublicBrowse public prompts.→
{ items[] }GET
{BASE_URL}/api/qcoreai/prompts/auditauthPrompt library audit log.→
{ items[] }PATCH
{BASE_URL}/api/qcoreai/prompts/:idauthUpdate prompt metadata.→
{ prompt }DELETE
{BASE_URL}/api/qcoreai/prompts/:idauthDelete prompt version.→
{ deleted }POST
{BASE_URL}/api/qcoreai/prompts/:id/forkauthFork 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/workspacesauthCreate a workspace.Body/params:
{ name, description? }→ { workspace }GET
{BASE_URL}/api/qcoreai/workspacesauthList workspaces (owned or member).→
{ items[] }PATCH
{BASE_URL}/api/qcoreai/workspaces/:idauthRename workspace.→
{ workspace }DELETE
{BASE_URL}/api/qcoreai/workspaces/:idauthDelete workspace.→
{ deleted }POST
{BASE_URL}/api/qcoreai/workspaces/:id/membersauthInvite a member.Body/params:
{ userId, role }→ { member }DELETE
{BASE_URL}/api/qcoreai/workspaces/:id/members/:userIdauthRemove member.→
{ ok }GET
{BASE_URL}/api/qcoreai/workspaces/:id/sessionsauthSessions in workspace.→
{ items[] }POST
{BASE_URL}/api/qcoreai/workspaces/:id/sessionsauthAdd session to workspace.Body/params:
{ sessionId }→ { ok }DELETE
{BASE_URL}/api/qcoreai/workspaces/:id/sessions/:sessionIdauthRemove session from workspace.→
{ ok }💰Spend limits & webhooks
GET
{BASE_URL}/api/qcoreai/me/spend-limitauthGet monthly spend limit.→
{ limit }PUT
{BASE_URL}/api/qcoreai/me/spend-limitauthSet monthly spend limit.Body/params:
{ monthlyLimitUsd, alertAt? }→ { limit }DELETE
{BASE_URL}/api/qcoreai/me/spend-limitauthRemove spend limit.→
{ ok }GET
{BASE_URL}/api/qcoreai/me/spend-summaryauthCurrent month spend vs. limit.→
{ spentUsd, limitUsd, pct, alerting, exceeded }GET
{BASE_URL}/api/qcoreai/me/webhookauthGet webhook config.→
{ webhook }PUT
{BASE_URL}/api/qcoreai/me/webhookauthSet webhook URL + secret.Body/params:
{ url, secret? }→ { webhook }DELETE
{BASE_URL}/api/qcoreai/me/webhookauthRemove webhook.→
{ ok }POST
{BASE_URL}/api/qcoreai/me/webhook/testauthSend a test run.completed event.→
{ ok, sentTo }GET
{BASE_URL}/api/qcoreai/me/webhook/logauthLast 50 webhook delivery attempts.Body/params:
?limit=→ { items[] }⚙️Health & config
GET
{BASE_URL}/api/qcoreai/healthpublicService health: storage, providers, guidance bus, live runs, features, version.→
{ ok, configuredProviders[], storage, guidanceBus, liveRuns, features[], version }GET
{BASE_URL}/api/qcoreai/providerspublicAvailable providers with model lists.→
{ providers[] }GET
{BASE_URL}/api/qcoreai/pricingpublicInput/output pricing per 1M tokens.→
{ table[] }GET
{BASE_URL}/api/qcoreai/agentspublicRole 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.startedFired when a multi-agent run begins.Fields:
runId, sessionId, strategy, userInput, startedAtagent.turnFired after each agent finishes.Fields:
runId, sessionId, role, stage, model, tokensIn, tokensOut, durationMs, costUsd, contentPreviewrun.completedFired when a run finishes (done / stopped / error).Fields:
runId, sessionId, status, finalContent, totalCostUsd, totalDurationMs, finishedAtsession.createdFired when a new session is created.Fields:
sessionId, userId, title, createdAtsession.archivedFired when a session is archived or unarchived.Fields:
sessionId, archived, archivedAtannotation.createdFired when an annotation is added to a run message.Fields:
annotationId, runId, userId, note, color, createdAt