Search the web.
Read any page.
$1.50 per 1,000.
Search our own web index for ranked JSON, or pull any page back as clean markdown.
$1.50 per 1,000. Prepaid credits, no subscription.
1,500+ users run 1,000,000+ queries a month.
liveEngineers at these companies build on Damn Good Search.
Pay for what you call.
Brave and Exa bundle page text into every search, read or not. We split them into two endpoints. Call search, call contents, or both, and the bill only counts what you used.
POST /api/v1/searchOur own web index as ranked URLs, snippets, and related queries. Most agent calls stop here.
POST /api/v1/contentsAny URL as clean markdown, for when you actually need the page. Skip it and pay nothing.
Both together, $3. Still under Brave's $5 and Exa's $7.
One call. Clean JSON back.
Same key, same shape, both endpoints. Search returns ranked results, contents returns markdown. Switch endpoint and language below.
curl -X POST https://damngoodsearch.com/api/v1/search \
-H "Authorization: Bearer dgs_live_..." \
-H "Content-Type: application/json" \
-d '{"query": "best espresso machines 2026"}'
import requests
resp = requests.post(
"https://damngoodsearch.com/api/v1/search",
headers={"Authorization": "Bearer dgs_live_..."},
json={"query": "best espresso machines 2026"},
)
print(resp.json()["results"])
const resp = await fetch("https://damngoodsearch.com/api/v1/search", {
method: "POST",
headers: { "Authorization": "Bearer dgs_live_...", "Content-Type": "application/json" },
body: JSON.stringify({ query: "best espresso machines 2026" }),
});
const { results, related } = await resp.json();
{
"query": "best espresso machines 2026",
"results": [
{
"title": "The 14 Best Espresso Machines of 2026",
"url": "https://www.seriouseats.com/best-espresso-machines",
"snippet": "Our favorite is the Breville Bambino Plus.",
"rank": 1,
"source": "Serious Eats"
}
],
"related": ["best espresso machine for home", "best budget espresso machine"],
"count": 10,
"ms": 42
}
curl -X POST https://damngoodsearch.com/api/v1/contents \
-H "Authorization: Bearer dgs_live_..." \
-d '{"url": "https://example.com/article"}'
import requests
resp = requests.post(
"https://damngoodsearch.com/api/v1/contents",
headers={"Authorization": "Bearer dgs_live_..."},
json={"url": "https://example.com/article"},
)
print(resp.json()["text"])
const resp = await fetch("https://damngoodsearch.com/api/v1/contents", {
method: "POST",
headers: { "Authorization": "Bearer dgs_live_...", "Content-Type": "application/json" },
body: JSON.stringify({ url: "https://example.com/article" }),
});
const { text } = await resp.json();
{
"url": "https://example.com/article",
"text": "# Example Article\n\nFull page, cleaned to markdown, ready for RAG.",
"ms": 110
}
Priced way below the rest.
The same web coverage and the features developers actually use, at a fraction of what the others charge.
| Feature | damngoodsearch | Brave Search | Exa | |
|---|---|---|---|---|
| Price per 1,000 searches | $1.50 | $5 | $7 | $5 |
| Page text | Optional, +$1.50 | Bundled in | Bundled in | Not offered |
| Our own web index | Yes | Yes | Yes | Yes |
| Results as clean JSON | Yes | Yes | Yes | Yes |
List prices per 1,000 searches from each provider's public pricing page, June 2026. Sources: brave.com/search/api, exa.ai, and developers.google.com/custom-search.
One flat rate for search and for contents, no tiers, and you only pay for calls that succeed. Prepaid credits, no subscription. Top up when you run low.
What you get.
Built for agents
Ranked, deduplicated JSON with source and related searches on every result. Drops straight into tool calls and RAG.
Two endpoints, one shape
Search and contents share the same auth, errors, and JSON conventions. Learn one and you know both.
Markdown, not HTML
Contents returns any page as clean markdown an LLM can read. No scraping, no boilerplate, no DOM to walk.
Easy to switch
Bearer auth and a three-field response. Point your client at it and map title, url, and snippet.
Fast
Tens of milliseconds on repeat queries, one to three seconds on fresh ones, so search rarely becomes the slow step in your agent loop.
Live in three steps.
No sales call, no setup project. Sign in and you are querying in a minute.
- 1
Sign in
Email and password. Signing in and signing up are the same step.
- 2
Copy your key
Your key is waiting in the dashboard. You see the full key once.
- 3
Send a query
POST your query with the key on the Authorization header. Read back ranked JSON.
Questions.
How do I get an API key?
Sign in with an email and password. Signing in and signing up are the same step, and your key is waiting in the dashboard right after.
Can I use it for agents and RAG?
Yes. Results come back ranked and deduplicated as structured JSON, the shape tool calls and retrieval pipelines expect.
How does billing work?
Prepaid credits, no subscription. Buy a balance, and each request draws $1.50 per 1,000 against it. Top up in the dashboard when you run low.
Why is it cheaper than Brave and Exa?
We run our own index and charge one flat price per 1,000 searches, with no per-result fees stacked on top.
What happens when a call fails?
You do not pay for it. A failed request is never billed, so your balance only moves on a successful call.
Get a key. Start searching.
$1.50 per 1,000. Prepaid credits, no subscription. Sign in and make your first call in a minute.