Try the plan for 0 credits#
Add dry_run=true and nothing runs and nothing is charged. You get the plan, each search that would run with its price, and your balance. Recorded on the dev API (shortened), for a query with two platform hints:
curl "https://api.onekey.dev/v1/search/universal?q=rust%20async%20runtime%20on%20hackernews%20and%20devto&dry_run=true" \
-H "x-api-key: YOUR_API_KEY"{
"success": true,
"data": {
"plan": {
"method": "deterministic",
"cleaned": "rust async runtime",
"selection": "hints",
"platforms": ["hackernews", "devto"],
"subqueries": { "hackernews": "rust async runtime", "devto": "rust" },
"adapted": { "devto": "first keyword only" }
},
"legs": [
{ "platform": "hackernews", "endpoint": "hackernews.search", "params": { "q": "rust async runtime" }, "credits": 1.0, "worst_case_credits": 1.0 },
{ "platform": "devto", "endpoint": "devto.search", "params": { "q": "rust" }, "credits": 5.0, "worst_case_credits": 5.0 }
],
"credits": { "legs_worst_case": 6.0, "legs_list_price": 6.0, "ai": null },
"ai_enabled": false
},
"metadata": { "recipe": "search_universal", "dry_run": true, "legs": 2, "credits_charged": 0.0 }
}Read it: the words "on hackernews and devto" chose the platforms and were removed from the query. Hacker News got the whole query. The DEV Community search accepts only one tag-style word, so it got the first keyword, and the plan says so in adapted. The whole call would cost at most 10 credits. Remove dry_run to run it.
What runs today, and what does not#
| Part | Today | Cost |
|---|---|---|
| Planner (platform hints, keywords, fitting the query to each search) | Works. Rules and string matching, the same plan for the same query. | Free |
| Fan-out (one search per platform, in parallel, failures isolated) | Works. | Each leg that succeeded, at its endpoint's price |
| Fusion (reciprocal rank fusion, k = 60) | Works. | Free |
Streaming (Accept: text/event-stream) | Works. Frames: plan, one leg per platform, fused, done. | Same as JSON |
Relevance (relevance=score or filter), themes (themes=true), AI planning (plan=ai) | Not enabled yet. | Metered per judged row when enabled |
With AI not enabled, a request that asks for relevance or themes and keeps the default strict=true is refused with AI_UNAVAILABLE before anything is fetched, so it costs nothing. With strict=false you get the fused list back unjudged. plan=ai falls back to the deterministic plan and says why in plan.ai. Details and the pre-release test figures are on AI pricing. This page makes no claim about the quality of AI results, because there are none to show.
Platforms it can search#
19 platforms have a search endpoint today. Without hints, the planner picks among them in a fixed order: stable before beta, then cheaper first, then by id, capped at max_platforms (default 6, at most 12). Name platforms with platforms=, hint them in the query ("on reddit", "from hn and devto"), or restrict by category=. The generated table is on the docs page.
Streaming#
Send Accept: text/event-stream and each platform's result arrives as its search settles, after the plan and before the merged list. Anything refused up front (bad parameters, an unsupported platform, a worst case above your balance) is an ordinary JSON error, never a stream. See Streaming.
What it costs#
- Planning, fusion and the request itself are free.
- Search legs are charged at each platform's normal search price, for the legs that succeeded. A cache hit is free and a failed leg is refunded.
- A worst-case check runs first. If the legs' worst case is above your balance the call is refused before anything runs.
- An Idempotency-Key replays the stored answer for 24 hours at 0 credits.
- One call counts as one request against your rate limit.
1,000 free credits cover the open-platform endpoints. Hard-to-reach platforms (X, TikTok, Instagram, Reddit, and others marked on their page) need a verified email and a purchased pack.
Limits, honestly#
- The planner is string rules, not understanding. A hint needs a preposition ("on reddit") or a content noun ("github repos about x"); a bare "reddit rust" is not a hint.
- Tag-style searches get one keyword.
plan.adaptedandplan.skippedshow what each platform received; a platform no form fits gets no leg. - Reranking, when enabled, is per platform against the cleaned query. There is no cross-platform model.
- Only search endpoints take part.
includeandlabelare not accepted here. - The hosted MCP server exposes this as one tool,
search_universal, without the dry-run option.