Get a suggestion
Pre-flight confirmation for mixed-model sessions. Send the turn you are about to send; get back the least expensive pool model that meets the project's quality floor for it, with a token. Send the turn with ib.suggestion set to that token to run it on the suggested model, or without it to stay on the requested model.
Body
application/json- modelstringrequired
The model you would request for this turn. Suggestions are issued against it, and the turn must request the same model to use the token.
- messagesarrayrequired
The turn exactly as you will send it. A Messages body (with
systemor Anthropic content blocks, or ananthropic-versionheader) is read as a Messages turn, and only suggests models that endpoint serves. - input, instructionsstring | arrayoptional
Instead of
messages, for a Responses turn: the body you will send to/v1/responses. It is read as a Responses turn, and only suggests models that endpoint serves.max_output_tokensis used for the estimate. - toolsarrayoptional
Sent so only models that support tools are suggested.
- response_formatobjectoptional
Sent so only models that support structured output are suggested.
- max_tokensintegeroptional
Used for the cost estimate.
max_completion_tokensis accepted too. - userstringoptional
Your end user, as on the turn (
metadata.user_idin a Messages body). Recorded on the classifier call for attribution and per-end-user Directives, and not forwarded. - ibobjectoptional
sessiongroups the call with its conversation.taskskips the classifier and is not charged.tagstags the classifier call, as on the turn. See the ib object.
Response
- suggestionstring | nullrequired
The token to send as
ib.suggestion.nullwhen no cheaper model fits; then send the turn as usual. - modelstringrequired
The model the turn would run on: the suggested one, or the requested one when there is no suggestion.
- taskClassstring | nullrequired
One of
extraction,summarization,rewriting,translation,general_qa,coding,complex_reasoning,unknown. - confidencenumber | nullrequired
Classifier confidence, 0 to 1.
- reasonstring | nullrequired
Why this was or wasn't suggested, e.g.
cheapest_passing,no_passing_model,low_confidence. See reasons. - estimateobjectrequired
Estimated USD for the turn on the requested model (
baselineUsd) and on the suggested one (suggestedUsd), and the classifier charge (classifierUsd). Estimates use a typical reply length. - expiresIninteger | nullrequired
Seconds until the token expires. Pre-flight tokens last 2 minutes.
- requestIdstringoptional
The receipt for the classifier call, in Logs. Absent when no call was made.
Headers
- Authorizationstringrequired
Bearer ib_live_…for a key set to Suggest under mixed-model sessions. - ib-sessionstringoptional
Same as
ib.session. - ib-userstringoptional
Your end user, up to 256 characters; wins over the body's. See End users and tags.
- ib-tagsstringoptional
Comma-separated tags, such as
inference-bureau-search, at most ten withib.tags. Never sent upstream.
When it's available
The key must be set to Suggest, and the project must use Pre-flight confirmation. Otherwise:
403 policy_deniedwhen the key is Off or in Shadow.400 invalid_requestwhen the project confirms inline. Read the suggestion from the chat response instead.
Billing
Each call that reaches the classifier is its own request, billed at Jev's input-token price plus the platform fee, with a receipt. No charge when a tool cycle is open (the response says tool_cycle_open and carries ib-pinned: tool_cycle), when you send ib.task, or when nothing can be sent to the classifier. The classifier call counts against your Directives like any request: per-end-user limits and budgets for the end user it names, and tag budgets for its tags. endUser.required refuses a call that names no end user.
Calls have 3 seconds, including one retry if the classifier is at capacity. A timeout returns no suggestion rather than an error, so the turn can go ahead on the requested model.