GET /v1/serp/content
Run a search and extract the content of the top results in one call. Returns SERP results with content blocks attached.
curl -G "https://api.chuger.com/v1/serp/content" \
--data-urlencode "q=react server components" \
--data-urlencode "max_content=10" \
--data-urlencode "whitelist_domains[]=*.dev" \
--data-urlencode "whitelist_domains[]=react.dev" \
--data-urlencode "blacklist_domains[]=ads.example.com" \
-H "Authorization: Bearer YOUR_API_TOKEN"
const params = new URLSearchParams();
params.set('q', 'react server components');
params.set('max_content', '10');
params.append('whitelist_domains[]', '*.dev');
params.append('whitelist_domains[]', 'react.dev');
params.append('blacklist_domains[]', 'ads.example.com');
const res = await fetch(`https://api.chuger.com/v1/serp/content?${params}`, {
headers: { Authorization: `Bearer ${process.env.CHUGER_TOKEN}` },
});
{
"search_information": {
"query_displayed": "react server components",
"total_results": 1230000,
"time_taken": 0.39
},
"organic_results": [
{
"position": 1,
"title": "React Server Components",
"link": "https://react.dev/learn/server-components",
"snippet": "Server Components let you...",
"displayed_link": "react.dev",
"favicon": "https://react.dev/favicon.ico",
"content": {
"url": "https://react.dev/learn/server-components",
"success": true,
"statusCode": 200,
"errorMessage": null,
"html": "<article>...</article>",
"markdown": "# Server Components
...",
"metadata": {
"title": "React Server Components",
"description": "Learn how Server Components work",
"language": "en",
"ogImage": "https://react.dev/og.png"
}
}
}
],
"related_questions": [],
"related_searches": []
}
{
"message": "Search with content extraction failed using available services."
}
Run a search and extract the content of the top results in a single request. Returns the same shape as /v1/serp but with a content block attached to each organic result that was fetched.
GET https://api.chuger.com/v1/serp/content
Authentication
Bearer token in the Authorization header. See Authentication.
Cost
Two things are billed when the request succeeds:
- The SERP query itself
- One content extraction for each result actually fetched (capped by
max_contentand your filtering)
| Plan | SERP | Each content fetch |
|---|---|---|
| Basic | 5 | 2 |
| Pro | 5 | 2 |
| Business | 5 | 2 |
Example on Pro with max_content=10, no filtering: 5 + (10 × 2) = 25 credits.
Always call /v1/credits/preview-cost before scaling this endpoint up.
Query parameters
The search query. 1–100 characters.
Location, free-form. Max 100 characters.
Interface language code. Max 10 characters.
Country code. Max 10 characters.
Search engine to run the query on: google (default), bing, or duckduckgo.
Results always come from the engine you asked for — if it can't be reached,
the request fails rather than silently answering from a different engine.
How many organic results to extract content for. 1–50. Defaults to 10.
Only fetch content from URLs whose domain matches one of these. Supports *.example.com.
Never fetch content from URLs whose domain matches one of these (takes precedence over the whitelist).
Filters apply after you get search results — they don't change what comes back from search, just whether we pull the content for each result. Domain matching supports exact matches, subdomain matches (example.com matches blog.example.com), and wildcards (*.example.com).
Example
When a result is skipped (filtered out or beyond max_content) the content field is omitted from that result. The content object matches the response shape of /v1/content.
Filtering behavior
A URL is fetched only if:
- It isn't blacklisted
- The whitelist is empty or contains a match
- We haven't already hit
max_contentsuccessful fetches
Domain matching is case-insensitive. *.example.com matches any subdomain (e.g. blog.example.com) as well as the bare apex (example.com). example.com (without a wildcard) matches any subdomain of example.com. URLs with unsafe hosts (raw IPs or non-default ports) are skipped automatically.
Errors
| Status | When |
|---|---|
401 | Missing / invalid token |
402 | No plan, or insufficient credits |
422 | Validation failed (missing q, bad max_content, invalid engine, etc.) |
429 | Rate limit or monthly quota exceeded |
503 | Search could not be completed |
See Errors for the full reference.
Tips
- Keep
max_contentas low as your use case allows — every additional fetch costs credits - Combine
whitelist_domainswith a smallmax_contentto focus on trusted sources without overspending - If you only need search results without bodies, use
/v1/serp— it's much cheaper