Search by meaning
Type 'cheap laptop for students' and a keyword index only finds documents containing those exact words. This endpoint understands what you meant, ranks results by conceptual closeness to your query, and surfaces the right document even when it never uses your phrasing.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
Why exact-match search keeps failing users
Keyword search has one deep flaw: it assumes the searcher and the author used the same words. A support article titled 'resetting your access credentials' is invisible to someone who searches 'forgot my password,' even though it's exactly what they need. Multiply that mismatch across a knowledge base, a product catalog, or a legal archive and a huge share of relevant content simply never surfaces, not because it's missing but because the index can't see past spelling.
What happens when you send a query
POST a query and a set of candidate documents (or a reference to an indexed collection) to /search/semantic and the task converts everything into vector representations that capture meaning rather than exact wording, then ranks candidates by how closely their meaning aligns with the query. The result is a ranked list of matches ordered by conceptual relevance, so 'affordable laptop for college' and 'cheap student computer' can both correctly surface the same product page.
Where the technique comes from
This is the same idea that underpins modern retrieval-augmented generation: represent text as points in a meaning-space, then find nearby points. It grew out of research into embeddings — numeric representations where similar concepts end up close together — and moved from academic information retrieval into everyday search boxes over the past several years, becoming the default expectation for any search that needs to feel intelligent rather than literal.
Where it fits your stack
Product search, internal documentation, customer support portals, and any RAG pipeline feeding an assistant with grounded context all lean on this endpoint as the retrieval layer: it finds the passages worth showing a user or feeding to a downstream model before anything gets generated. Because it's a single async call, it drops into an existing search box, a content recommendation job, or a chat pipeline without requiring you to run or maintain your own vector infrastructure.
Cost and delivery
Each call is billed at a small flat rate per request plus a per-query charge, published on this page with no hidden markup for result count or document length. Submit the request, receive a task_id right away, and collect the ranked results by signed webhook or a signed link valid for 24 hours; a failed task retries automatically up to three times and is never billed if it still can't complete.
What you can do with it
Product catalog search
An online store lets shoppers search in their own words — 'gift for someone who runs' — and get the right product even when the listing never uses that phrasing.
Internal knowledge base lookup
A support team searches an internal wiki with a customer's actual words and gets the matching article even though the article title uses entirely different terminology.
Retrieval layer for a RAG assistant
A chatbot pulls the most conceptually relevant passages from a document set before generating an answer, keeping responses grounded in real content.
Legal and research archive search
A research team searches thousands of case files by concept rather than exact legal phrasing, surfacing precedent that a keyword search would have missed entirely.
FAQ
What is a semantic search API and how does it differ from keyword search?
It ranks results by meaning rather than exact word matches, so a query and a relevant document can use completely different wording and still match correctly.
Do I need to build my own vector database first?
No, you send the query and candidate documents (or an indexed collection reference) directly to the endpoint and it handles the meaning-based ranking for you.
Is semantic search free to use?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
How fast do I get results back?
The endpoint is asynchronous: you get a task_id immediately, and the ranked results arrive shortly after by signed webhook or a signed link valid for 24 hours.
Can it search documents in multiple languages?
The endpoint works with the meaning captured in your candidate documents and query as submitted; consistent language pairing between query and corpus produces the most reliable ranking.
How is this different from hybrid search or reranking?
Semantic search ranks purely by meaning; hybrid search fuses it with keyword matching for exact-term precision, and reranking reorders an existing result set for finer relevance — each is its own endpoint depending on what you already have.
Can I run bulk queries against a large document set?
Yes, submit each query as its own async request; there's no artificial cap on how many requests you send, only the standard per-request and per-query pricing.
What happens if a semantic search request fails?
The task retries automatically up to three times, returns a clear error if it still can't complete, and a failed request is never charged.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/search/semantic \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/search/semantic", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/search/semantic",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/search/semantic", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/search/semantic", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"input": "…"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "search.semantic",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_chunks | 10000 |
max_tokens | 20000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |