Synoppy v1.0 is here— start free
DocsSearch
Endpoint

Search

Try it livePOST /api/search

Sent only to Synoppy over HTTPS · never stored by this page. No key? Get one free →

POST/api/search queries the live web and returns ranked results — each with a title, url, and snippet. It's the discovery layer that pairs with Read: find the right pages, then pull their full content. Set markdown to also read each result into clean Markdown in the same call. Requires an API key. This endpoint is live.

Request body

querystringrequired
The search query to run against the live web.
maxResultsnumber
How many results to return. 1–15, defaults to 5.
markdownboolean
Also read each result into clean Markdown in the same trip, so every entry comes back with a markdown field. Defaults to false (titles, urls, and snippets only).
includeDomainsstring[]
Optional. Restrict results to these domains only — everything else is filtered out.
excludeDomainsstring[]
Optional. Never return results from these domains.
fanoutboolean
Expand the query into related variations for higher recall, then merge and re-rank the results. Defaults to false.

Example request

curl -X POST https://synoppy.com/api/search \
  -H "Authorization: Bearer $SYNOPPY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "best open-weight LLMs 2026",
    "maxResults": 5,
    "markdown": true
  }'

Response

Results come back ranked, each with a clean source url. The markdown field is only present when you asked for it.

{
  "success": true,
  "query": "best open-weight LLMs 2026",
  "count": 5,
  "results": [
    {
      "title": "The best open-weight models, ranked",
      "url": "https://example.com/open-weights-2026",
      "snippet": "A side-by-side look at the leading open-weight releases...",
      "markdown": "# The best open-weight models, ranked\n\n..."
    }
  ],
  "latencyMs": 1342,
  "creditsUsed": 4,
  "creditsRemaining": 4996
}

Response fields

successboolean
True when the search succeeded.
querystring
The query that was run (echoes your request).
countnumber
Number of results returned (at most maxResults).
results{ title, url, snippet, markdown? }[]
One entry per result, ranked best-first: title, url (a clean source link), and snippet. markdown is included only when markdown: true was set.
latencyMsnumber
End-to-end time in milliseconds (higher when markdown reads are included).
creditsUsednumber
Credits charged — metered by the real search cost plus any per-result reads.
creditsRemainingnumber
Your credit balance after this call.

Billing

There's no flat fee. A Search is metered by the real cost of the underlying web search, plus any per-result reads when you pass markdown: true — so a plain query is cheap, and reading every result costs more. Every response returns the exact creditsUsed.

In code

import { Synoppy } from "@synoppy/sdk";
const synoppy = new Synoppy({ apiKey: process.env.SYNOPPY_API_KEY });

const res = await synoppy.search("best open-weight LLMs 2026", {
  maxResults: 5,
  markdown: true,
});
for (const r of res.results) console.log(r.title, r.url);