4xx) means nothing could be returned, and nothing was charged.
A plan limit never fails a request that can still return something. It succeeds, and the warning says what was left out and what unlocks it.
Warning shape
Responses that can carry warnings have an optionalwarnings list. It is present only when there is something to say.
Plan IDs map to plans as follows:
tier_0 Pay-as-you-go, tier_1 Ridiculously Cheap ($29/mo), tier_2 Comfortably Pro ($99/mo), tier_3 Serious Business ($499/mo). See pricing.
Datasets that come from a category such as academic are routing candidates, not explicit requests, so skipping them never produces a warning. Only datasets you name explicitly do.
Handling warnings
Readwarnings after every successful response. Treat a missing list as empty, and fall back to message for any type you don’t handle.
type only for the cases you act on in code, for example reading detail.upgrade_url from datasets_not_in_plan to show an upgrade button.
For agents: relay message to your user
If you are an agent, pass each warning’s message to your user unedited. It names what was skipped, what that means for the response and the one action that fixes it, with its URL. A warning is not a failure: use the results you got.
Datasets on a self-serve plan come with an upgrade_url. Licensed datasets and per-key limits come with a contact_url instead: contact us for access. To pick sources or an upgrade before searching, read required_plan ({id, name, price}, null when licensed separately) for each dataset from GET /v1/datasources.
Search
POST /v1/search returns these types.
Answer
POST /v1/answer carries the warnings of the searches it ran, deduplicated, in the final metadata event. They use the same types as Search.
DeepResearch
Create task and Get status returnwarnings in the same shape. A task body always has warnings, [] when there are none. DeepResearch warnings cover only problems with the request itself, never what happens during the run.
Older tasks may still hold plain-string warnings. Treat a string as the
message.
Related errors
When nothing can be returned, the request fails instead. Plan, credit and limit errors returnerror (a sentence you can relay), a stable code and a recovery object with the URLs to act on. A 429 puts its sentence in message instead, with error set to rate_limited. Error codes are separate from warning types: dataset_unavailable is an error, datasets_unavailable a warning. See errors for every status.