One call, start to finish
Your app
POST /api/query
Synero API
Fans out in parallel
Each answers on its own
Combined answer
Plus agreement score
Quick Start
Quickstart: your first multi-model call
curl -X POST https://synero.ai/api/query \
-H "Authorization: Bearer sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "What are the trade-offs between microservices and monoliths?",
"context": [{"name": "architecture.md", "content": "# Our System\n..."}],
"format": "json"
}'This request uses format: "json" and returns advisors, synthesis, and consensus (score, agreements, splits). Omit it and the response streams as server-sent events: each model's tokens arrive in real time, followed by the synthesis and the consensus event. A JSON run still going after about 60 seconds answers 200 and sends newlines until the object, so prefer the stream for deep or web_search runs.
Features
Everything you need to integrate
A single endpoint that queries multiple AI models, synthesizes their responses, scores their agreement, and streams everything to your application.
4 Models, 1 Call
GPT, Claude, Gemini, and Grok queried in parallel, each answering independently so a disagreement is a real one.
Real-time SSE Streaming
Watch each model respond token by token in parallel, then the synthesis and agreement analysis arrive.
Consensus Answer and Agreement Score
A synthesizer reads every response and writes one answer. A separate analysis returns a 0-100 agreement score, the points all models share, and exactly where they split, with each model's stance.
Pick Your Models
Choose which model fills each of the four advisor slots and the synthesizer. The four named personas (Architect, Philosopher, Explorer, Maverick) are an API option.
Conversation Threads
Build multi-turn conversations with thread IDs and history context for follow-up questions.
Simple Auth & Limits
Bearer token authentication. 60 requests/min per key. Manage keys from your dashboard.
What the API returns, in the app
Models
20 models from 4 providers
Mix and match any model for any advisor slot. Use the defaults or build your own custom council. Also available through the MCP server.
OpenAI
- gpt-6.1-sol
- gpt-6-luna
- gpt-6-astra
- gpt-5.6-sol
- gpt-5.6-terra
- gpt-5.6-luna
Anthropic
- claude-opus-5-5
- claude-sonnet-5-5
- claude-fable-5-1
- claude-opus-5
- claude-sonnet-5
- claude-haiku-5-5
- gemini-3.8-flash
- gemini-3.5-flash
- gemini-3.5-flash-lite
- gemini-3.1-pro-preview
xAI
- grok-4.7
- grok-4.6
- grok-4.5
- grok-4.3
Reference
SSE event types
The response stream emits these event types. Each event includes a JSON data payload.
council-metatier, advisorModels, synthesizerModel, preset?, webSearch?
First event: the models running this question and the resolved preset or tier
advisorid, token, status
Incremental token from an advisor
advisor-completeid, modelId, inputTokens, outputTokens, latencyMs
Advisor finished responding
advisor-errorid, error
Advisor failed or returned no text (provider error, refusal, or empty answer); the others continue
synthesis-start(none)
The synthesizer is starting; only sent when synthesis runs
synthesistoken, status
Incremental token from the synthesizer
synthesis-completeinputTokens, outputTokens, skipped?, reason?, error?
Synthesis finished. skipped means it never ran; error means it failed or produced no text, so discard any synthesis tokens received (the query still completes)
consensusscore, unanimous, contested, dissenter, takeaway
Where the advisors agree and split, with a 0-100 agreement score. Usually arrives during the synthesis but may arrive after complete, so read until the stream closes. Also sent when synthesis is skipped (2+ answers).
completequeryId
The answer is done. A late consensus event may still follow, so read until the stream closes
errormessage
Fatal error, such as every advisor failing. Advisor tokens already used are still billed
| Event | Data Fields | Description |
|---|---|---|
council-meta | tier, advisorModels, synthesizerModel, preset?, webSearch? | First event: the models running this question and the resolved preset or tier |
advisor | id, token, status | Incremental token from an advisor |
advisor-complete | id, modelId, inputTokens, outputTokens, latencyMs | Advisor finished responding |
advisor-error | id, error | Advisor failed or returned no text (provider error, refusal, or empty answer); the others continue |
synthesis-start | (none) | The synthesizer is starting; only sent when synthesis runs |
synthesis | token, status | Incremental token from the synthesizer |
synthesis-complete | inputTokens, outputTokens, skipped?, reason?, error? | Synthesis finished. skipped means it never ran; error means it failed or produced no text, so discard any synthesis tokens received (the query still completes) |
consensus | score, unanimous, contested, dissenter, takeaway | Where the advisors agree and split, with a 0-100 agreement score. Usually arrives during the synthesis but may arrive after complete, so read until the stream closes. Also sent when synthesis is skipped (2+ answers). |
complete | queryId | The answer is done. A late consensus event may still follow, so read until the stream closes |
error | message | Fatal error, such as every advisor failing. Advisor tokens already used are still billed |
Error codes
Every error is JSON: { error, code, doc_url }. Branch on code; the message may change.
- 400
invalid_jsonThe request body is not valid JSON
- 400
missing_promptNo prompt was sent
- 400
prompt_too_longThe prompt is over 10,000 characters
- 400
invalid_contextA context item is malformed or over the size limits
- 400
invalid_configconfig or web_search has a wrong type or an unknown tier or model
- 400
invalid_modelsmodels or preset names an unknown model, or two from one provider
- 400
invalid_synthesis_instructionssynthesisInstructions is not a string or is over 10,000 characters
- 400
unknown_templateNo template has that slug
- 400
invalid_threadthread_id or parent_query_id is not a string
- 400
invalid_parent_query_idparent_query_id is not a UUID
- 400
invalid_thread_idthread_id is not a UUID
- 400
name_too_longThe API key name is too long
- 400
key_limit_reachedToo many active API keys; revoke one first
- 401
invalid_api_keyThe API key is wrong or revoked
- 401
auth_requiredSend a Bearer API key or sign in
- 402
trial_exhaustedThe 3 free questions are used; add credit or subscribe
- 402
subscription_inactiveThe subscription lapsed and no credit is left
- 402
no_creditsNo credit left; add credit from $5
- 404
parent_not_foundparent_query_id is not one of your saved queries
- 404
key_not_foundNo API key of yours has that id
- 429
rate_limit_exceededOver 60 requests a minute on this key; wait for Retry-After
- 429
runs_in_progressQuestions already running reserved the rest of your balance; no Retry-After, retry when they finish or add credit
- 500
internal_errorSomething failed on our side; retry
- 502
all_advisors_failedEvery model failed; failedAdvisors says why
Get an API key and ask four models at once
Free to try: 3 free calls, no card. Then pay as you go: $5 of credit, no subscription, billed by tokens used. See pricing.