The API.

Two endpoints, one shape. Send your key as a bearer token, POST JSON, read back ranked JSON. Learn search and you know contents.

Base URL
https://damngoodsearch.com/api/v1/search
Method
POST
Auth
Authorization: Bearer <key>

Authenticate.

Every request carries your key as a bearer token. Create one in the dashboard, then send it on the Authorization header.

Get your API key

Make a request.

Send a POST with a JSON body. Only query is required.

curl
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"}'
FieldTypeRequiredDescription
querystringyesThe search query.

Read the response.

Results come back ranked and deduplicated, the shape a tool call expects.

Response
{
  "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
}
FieldTypeRequiredDescription
querystringyesThe query you sent, echoed back.
resultsobject[]yesRanked, deduplicated results. See the result fields below.
relatedstring[]yesRelated searches, useful for query expansion and follow-ups.
countnumberyesNumber of results returned.
msnumberyesServer-side response time in milliseconds.

Each result contains:

FieldTypeRequiredDescription
titlestringyesThe result's title.
urlstringyesThe result's URL.
snippetstringnoA short text summary of the result. May be empty when the source provides none.
ranknumberyes1-based position in the result set.
sourcestringnoPublisher or site name, when known.
displayUrlstringnoHuman-readable breadcrumb for the URL.

Fetch the page.

Search returns where to look. When you need the full text of a result, call contents with the URL. It comes back as clean markdown, billed separately so you only pay when you use it.

Endpoint
https://damngoodsearch.com/api/v1/contents
Price
$1.50 / 1,000
curl
curl -X POST https://damngoodsearch.com/api/v1/contents \
  -H "Authorization: Bearer dgs_live_..." \
  -d '{"url": "https://example.com/article"}'
FieldTypeRequiredDescription
urlstringyesThe http(s) URL to fetch.

The response:

FieldTypeRequiredDescription
urlstringyesThe URL you sent.
textstringyesThe page's main content as clean markdown.
msnumberyesServer-side response time in milliseconds.

Errors.

Failures come back as JSON with an error field and a matching status code.

StatusMeaning
400The request body was not valid JSON, or a required field (query or url) was missing.
401The API key was missing, malformed, or revoked.
402The credit balance is empty. Add credits in the dashboard to keep going.
429Too many requests. The per-key rate limit is 1,000 requests per minute. Email hello@damngoodsearch.com to raise it.
503The endpoint was briefly unavailable. Retry after the Retry-After header.

Rate limits.

Search and contents calls each count as one request, billed at $1.50 per 1,000 against your prepaid balance. Your balance and live count are in the dashboard.

View your usage