Nodeshub is a powerful API that delivers structured data from Google search results. Instead of complicated scraping, you get ready-to-use JSON data in seconds. Perfect for SEO analysis, competitor monitoring, market research, and marketing automation.
The fastest way to try Nodeshub — no setup required. You get 100 free crawls instantly.
Important — save your API key!
Use your API key to make requests directly from the terminal. Replace YOUR_API_KEY with your actual key.
curl -X GET "https://api.nodeshub.io/v1/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d "keyword=pizza warszawa" \
-d "gl=pl" \
-d "hl=pl" \
-d "device=desktop"Parameters explained:
keyword — the search query you want to analyzegl — country code for Google results (e.g. "us", "pl", "de")hl — language code for the interface (e.g. "en", "pl", "de")device — "desktop" or "mobile"The response is a JSON object containing organic results, SERP features, rankings, snippets, and more. See the Response Structure section for full details.
Connect Nodeshub to no-code platforms like n8n, Make.com, or Zapier using a simple HTTP request node with your API key. Perfect for scheduled SERP monitoring, automated reports, and competitive analysis.
For step-by-step setup instructions for each platform, see the No-Code Automations section below.
Try-it-out plan. No strings attached.
Free/100 tokens
Perfect for small projects and testing
$19/5000 tokens
Great for regular use and medium-sized projects
$99/40 000 tokens
Ideal for large-scale analysis and heavy usage
$299/175 000 tokens
Use Nodeshub directly inside Claude Desktop with the Model Context Protocol (MCP). Search Google, analyze SERPs, and get structured data without leaving your conversation.
Visit nodeshub.io and copy your API key from the playground. You get 100 free crawls instantly.
Open the configuration file for your OS:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Add this to your config file:
{
"mcpServers": {
"nodeshub": {
"command": "npx",
"args": ["-y", "nodeshub-mcp"],
"env": {
"NODESHUB_API_KEY": "your-api-key-here"
}
}
}
}Restart Claude Desktop and start using Nodeshub in your conversations. Try asking:
Connect Nodeshub to your favorite automation tools. Schedule SERP checks, build reports, and monitor competitors — without writing a single line of code.
Open-source workflow automation. Add an HTTP Request node, point it at Nodeshub, and connect to 400+ integrations.
https://api.nodeshub.io/v1/searchAuthorization: Bearer YOUR_API_KEYkeyword, hl, gl, deviceVisual automation platform. Use the HTTP module to call Nodeshub and route SERP data to any app.
https://api.nodeshub.io/v1/search?keyword=YOUR_KEYWORD&hl=en&gl=usAuthorization: Bearer YOUR_API_KEYConnect Nodeshub to 6,000+ apps. Use Webhooks by Zapier to call the API and trigger downstream actions.
https://api.nodeshub.io/v1/search?keyword=YOUR_KEYWORD&hl=en&gl=usAuthorization | Bearer YOUR_API_KEYAn open-source toolkit of ready-made SEO skills for Claude Code, Gemini CLI, or any AI CLI. Clone the repo, type a slash command, and get structured SEO results instantly.
git clone https://github.com/nodes-hub/nodeshub_seo_skills.gitexport NODESHUB_API_KEY=your-api-key-here12 ready-made skills covering common SEO workflows:
/nod_keyword-researchKeyword clustering and intent analysis
/nod_serp-analysisAnalyze SERP features and competition
/nod_content-briefGenerate content briefs from SERP data
/nod_rank-trackerTrack keyword positions over time
/nod_competitor-checkMonitor competitor SERP presence
/nod_paa-extractorExtract People Also Ask questions
See the full list and documentation on GitHub, or visit the SEO Skills page.
In Claude Code or any compatible AI CLI:
> /nod_keyword-research "best CRM tools"
✓ 52 keywords found
✓ 7 clusters identified
✓ Intent mapped for each keyword
✓ Search volume & difficulty estimated| Code | Meaning | Solution |
|---|---|---|
400 | Bad Request | Check query parameters (keyword, gl, hl) |
401 | Unauthorized | Check Authorization: Bearer YOUR_API_KEY |
429 | Too Many Requests | Slow down request rate or upgrade plan |
500 | Internal Server Error | Try again later |
Endpoint: https://api.nodeshub.io/v1/search
Request Structure:
GET https://api.nodeshub.io/v1/search?keyword=pizza+warszawa&hl=pl&gl=pl&device=desktop
Authorization: Bearer YOUR_API_KEY| Parameter | Type | Description | Example |
|---|---|---|---|
keyword | String | Search phrase | "best+programming+courses" |
| Parameter | Type | Description | Example Values |
|---|---|---|---|
hl | String | Interface language | "en", "pl", "de", "fr", "es" |
gl | String | Geographic location (country) | "us", "pl", "de", "uk", "fr" |
device | String | Device type | "desktop", "mobile" |
num | Integer | Number of results Currently unavailable | 10, 20, 30, 50, 100 |
Important Note: The num parameter is temporarily unavailable due to Google API changes. All queries currently return the default number of results (around 10).
Top level: data, totalResponseTime. Snippets live under data.results.snippets (not snippets_data). Organic results use pos, url, domain, description.
{
"data": {
"success": true,
"search_engine": "google",
"location": "pl",
"language": "pl",
"timestamp": "2026-02-26T12:00:00Z",
"results": {
"query": "pizza warszawa",
"organic_results": [
{
"pos": 1,
"global_pos": 2,
"title": "Best pizza in Warsaw - 24/7 Delivery",
"url": "https://pizzawarszawa.pl",
"domain": "pizzawarszawa.pl",
"description": "Best pizza in Warsaw with home delivery..."
}
],
"snippets": {
"people_also_ask": { "questions": [], "rank_absolute": 3 },
"related_searches": { "queries": [], "rank_absolute": 12 },
"ai_overview": {},
"local_pack": [],
"ads": []
},
"snippets_found": []
}
},
"totalResponseTime": 1240
}Use response.data.results.snippets.people_also_ask, response.data.results.snippets.related_searches, etc. Metadata is in data (location, language, timestamp).
Snippets are SERP elements returned under data.results.snippets. Which keys are present depends on the query. You can check data.results.snippets_found (array of names) to see which snippets were found for your request.
An AI-generated summary by Google that provides a synthesized answer to a user's query.
JSON Preview
{
"ai_overview": {
"has_listen_button": false,
"rank_absolute": 1,
"sources": [
{
"display_url": "Facebook Business",
"rank_inner": 1,
"snippet": "Facebook advertising helps businesses...",
"title": "Facebook Advertising Guide",
"url": "https://www.facebook.com/business/ads"
}
],
"status": "success",
"text": "Facebook advertising allows businesses to target specific..."
}
}Paid Google Advertisements that appear at the top of search results.
JSON Preview
{
"ads": [
{
"description": "Order The New Galaxy S25 Ultra...",
"display_url": "https://www.samsung.com",
"rank_absolute": 1,
"rating": {
"reviews": null,
"stars": null
},
"sitelinks": [
{ "title": "Shop Now", "url": "https://..." }
]
}
]
}A dynamic section showing related questions that users frequently ask.
JSON Preview
{
"people_also_ask": {
"questions": [
{ "rank_inner": 1, "text": "How do Facebook ads work?", "expanded": false },
{ "rank_inner": 2, "text": "What is the best audience for ads?", "expanded": false }
],
"rank_absolute": 3
}
}A Google feature that provides quick, structured information about entities like people, places, or things.
JSON Preview
{
"knowledge_graph": {
"title": "OpenAI",
"subtitle": "Artificial intelligence company",
"description": "OpenAI is an American AI research organization...",
"image_url": "https://...",
"attributes": {
"Founded": "December 11, 2015",
"Headquarters": "San Francisco, California",
"CEO": "Sam Altman"
},
"rank_absolute": 1
}
}A map-based snippet showing local businesses related to a search query. Access via data.results.snippets.local_pack.
JSON Preview
{
"local_pack": [
{
"title": "Best Pizza Warsaw",
"address": "ul. Marszalkowska 12, Warsaw",
"phone": "+48 22 123 4567",
"rating": 4.5,
"reviews_count": 120,
"website": "https://bestpizzawarsaw.pl",
"open_now": true,
"rank_inner": 1
}
]
}Quick answers to popular questions related to the query. Access via data.results.snippets.things_to_know.
JSON Preview
{
"things_to_know": {
"items": [
{
"title": "Types of pizza ovens",
"snippet": "The main types include wood-fired, gas, and electric...",
"url": "https://...",
"rank_inner": 1
}
],
"rank_absolute": 5
}
}Posts and insights from Reddit, YouTube, Quora, etc. Access via data.results.snippets.perspectives.
JSON Preview
{
"perspectives": [
{
"source": "Reddit",
"author": "u/pizzalover",
"title": "Best pizza spots in Warsaw - my top picks",
"snippet": "After trying 50+ places, here are my favorites...",
"url": "https://reddit.com/r/warsaw/...",
"votes": 245,
"date": "3 weeks ago",
"rank_inner": 1
}
]
}Chips under the search bar for quick narrowing (e.g. "Under $500", "On sale"). Use for long-tail keyword research via data.results.snippets.refine_chips.
JSON Preview
{
"refine_chips": [
{ "label": "On sale", "url": "https://google.com/search?q=...&tbs=..." },
{ "label": "Under $500", "url": "https://google.com/search?q=..." },
{ "label": "Free shipping", "url": "https://google.com/search?q=..." },
{ "label": "4+ stars", "url": "https://google.com/search?q=..." }
]
}Recipe cards with ingredients, time, rating. Access via data.results.snippets.recipes_results. Ideal for food blogs and recipe SEO.
JSON Preview
{
"recipes_results": [
{
"title": "Classic Margherita Pizza",
"source": "Bon Appetit",
"rating": 4.8,
"reviews_count": 340,
"total_time": "45 min",
"ingredients": ["flour", "mozzarella", "tomato sauce", "basil"],
"thumbnail_url": "https://...",
"url": "https://...",
"rank_inner": 1
}
]
}Highlighted answer box at the top of search results with extracted content. Access via data.results.snippets.featured_snippets.
JSON Preview
{
"featured_snippets": [
{
"type": "paragraph",
"title": "What is SEO?",
"description": "Search engine optimization is the process of...",
"url": "https://...",
"display_url": "example.com › seo-guide",
"rank_absolute": 1,
"rank_inner": 1
}
]
}Recent news articles related to the search query. Access via data.results.snippets.top_stories.
JSON Preview
{
"top_stories": [
{
"rank_absolute": 6,
"stories": [
{
"title": "Here's how the new Samsung Galaxy S26 compares...",
"source": "The Verge",
"url": "https://www.theverge.com/...",
"published": "19 hours ago",
"is_live": false,
"rank_inner": 1
}
]
}
]
}Video results carousel from YouTube and other sources. Access via data.results.snippets.videos_pack.
JSON Preview
{
"videos_pack": [
{
"rank_absolute": 3,
"title": "Videos",
"videos": [
{
"title": "Python Full Course for Beginners",
"channel": "Programming with Mosh",
"duration": "6:14:07",
"source": "YouTube",
"published": "Feb 18, 2019",
"url": "https://www.youtube.com/watch?v=...",
"rank_inner": 1
}
]
}
]
}Product carousels with prices, ratings, and merchant info. Access via data.results.snippets.popular_products.
JSON Preview
{
"popular_products": [
{
"products": [
{
"title": "Nike Air Max SC Men's",
"price": 94.99,
"merchant": "DICK'S Sporting Goods",
"delivery_info": "Free delivery",
"discount_percent": null,
"rating": { "stars": 4.6, "reviews": 5100 },
"rank_inner": 1
}
]
}
]
}Image results carousel embedded in search results. Access via data.results.snippets.images_pack.
JSON Preview
{
"images_pack": [
{
"images": [
{
"title": "Nike Air Max 90 By You Custom Men's Shoes",
"alt_text": "Nike Air Max 90 By You Custom Men's Shoes",
"source": "Nike",
"url": "https://www.nike.com/...",
"rank_inner": 1
}
]
}
]
}Forum posts and community discussions from Reddit, Quora, and other platforms. Access via data.results.snippets.discussions_and_forums.
JSON Preview
{
"discussions_and_forums": [
{
"answer_count_text": "80+ comments",
"details": "r/samsung · 80+ comments · 1 month ago",
"rank_inner": 1
}
]
}Academic papers from Google Scholar embedded in search results. Access via data.results.snippets.scholarly_articles.
JSON Preview
{
"scholarly_articles": [
{
"title": "A review of the final US Climate Change...",
"citation_text": "National Research Council",
"cited_by_text": "Cited by 1381",
"url": "https://scholar.google.com/...",
"rank_absolute": 13
}
]
}Detailed product panel on the right side of results with description, filters, and merchant offers. Access via data.results.snippets.product_info_right.
JSON Preview
{
"product_info_right": {
"description": "Discover the Samsung Galaxy S25 5G...",
"filters": ["Color", "Storage"],
"offers": [
{
"seller": "AT&T",
"price": "$15.99",
"condition": "New",
"url": "https://www.att.com/..."
},
{
"seller": "Samsung",
"price": "$799.99",
"condition": "New",
"url": "https://www.samsung.com/..."
}
]
}
}Related product suggestions shown for product queries. Access via data.results.snippets.people_also_search_products.
JSON Preview
{
"people_also_search_products": [
{
"products": [
{
"name": "Samsung Galaxy S25+",
"image_url": "https://...",
"position": 1,
"url": "https://google.com/search?q=..."
}
]
}
]
}Local store listings with availability for product queries. Access via data.results.snippets.stores_nearby.
JSON Preview
{
"stores_nearby": [
{
"store_name": "Best Buy",
"address": "123 Main St",
"availability": "In stock",
"price": "$799.99"
}
]
}Organic results are in data.results.organic_results. Each item has pos, global_pos, title, url, domain, description.
// Track your website position for target keywords
function trackPosition(targetDomain, searchResults) {
const organicResults = searchResults.data.results.organic_results;
const position = organicResults.findIndex(result =>
result.url.includes(targetDomain)
) + 1;
if (position > 0) {
console.log(`Your domain ranks at position ${position}`);
// Analyze competitors above you
const betterResults = organicResults.slice(0, position - 1);
console.log('Competitors ranking higher:');
betterResults.forEach((result, index) => {
console.log(`${index + 1}. ${result.title} - ${result.url}`);
});
return position;
} else {
console.log('Your domain not found in top results');
return null;
}
}
// Usage example
const myPosition = trackPosition('mywebsite.com', searchResponse);// Analyze SERP features for keyword difficulty assessment
function analyzeSerpFeatures(searchResponse) {
const features = searchResponse.data.results.snippets_found || [];
console.log('SERP Features detected:', features);
// Calculate keyword difficulty based on features
let difficulty = 'Easy';
if (features.includes('knowledge_graph')) {
difficulty = 'Hard';
console.log('Knowledge Graph detected - High competition');
}
if (features.includes('ai_overview')) {
difficulty = 'Very Hard';
console.log('AI Overview present - Very high competition');
}
if (features.includes('videos_pack')) {
console.log('Video results present - Consider video content');
}
if (features.includes('popular_products')) {
console.log('Shopping results - Commercial intent keyword');
}
return {
difficulty,
features,
recommendations: generateRecommendations(features)
};
}
function generateRecommendations(features) {
const recommendations = [];
if (features.includes('people_also_ask')) {
recommendations.push('Create FAQ content addressing PAA questions');
}
if (features.includes('videos_pack')) {
recommendations.push('Develop video content strategy');
}
if (features.includes('related_searches')) {
recommendations.push('Target related search terms for long-tail SEO');
}
return recommendations;
}// Comprehensive competitor analysis
function analyzeCompetitors(searchResults) {
const organicResults = searchResults.data.results.organic_results;
// Domain frequency analysis
const domainStats = {};
organicResults.forEach((result, index) => {
const domain = result.domain;
if (!domainStats[domain]) {
domainStats[domain] = {
positions: [],
titles: [],
descriptions: [],
averagePosition: 0
};
}
domainStats[domain].positions.push(index + 1);
domainStats[domain].titles.push(result.title);
domainStats[domain].descriptions.push(result.description);
});
// Calculate average positions
Object.keys(domainStats).forEach(domain => {
const positions = domainStats[domain].positions;
domainStats[domain].averagePosition =
positions.reduce((a, b) => a + b, 0) / positions.length;
});
// Sort by average position (best first)
const sortedCompetitors = Object.entries(domainStats)
.sort(([, a], [, b]) => a.averagePosition - b.averagePosition);
console.log('Top competitors:');
sortedCompetitors.slice(0, 5).forEach(([domain, stats], index) => {
console.log(`${index + 1}. ${domain}`);
console.log(` Average position: ${stats.averagePosition.toFixed(1)}`);
console.log(` Appears in positions: ${stats.positions.join(', ')}`);
console.log(` Sample titles: ${stats.titles.slice(0, 2).join(' | ')}`);
});
return sortedCompetitors;
}
// Usage
const competitors = analyzeCompetitors(searchResponse);curl -X GET "https://api.nodeshub.io/v1/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d "keyword=pizza warszawa" \
-d "gl=pl" \
-d "hl=pl" \
-d "device=desktop"const API_KEY = process.env.NODESHUB_API_KEY;
const response = await fetch(
'https://api.nodeshub.io/v1/search?keyword=pizza+warszawa&hl=pl&gl=pl',
{ headers: { 'Authorization': `Bearer ${API_KEY}` } }
);
const data = await response.json();
const organic = data?.data?.results?.organic_results ?? [];
const related = data?.data?.results?.snippets?.related_searches?.queries ?? [];import os
import requests
url = "https://api.nodeshub.io/v1/search"
headers = {"Authorization": f"Bearer {os.environ.get('NODESHUB_API_KEY')}"}
params = {"keyword": "pizza warszawa", "gl": "pl", "hl": "pl"}
response = requests.get(url, headers=headers, params=params)
data = response.json()
organic = data.get("data", {}).get("results", {}).get("organic_results", [])
related = (data.get("data", {}).get("results", {}).get("snippets", {}) or {}).get("related_searches", {}).get("queries", [])$url = 'https://api.nodeshub.io/v1/search?' . http_build_query([
'keyword' => 'pizza warszawa', 'gl' => 'pl', 'hl' => 'pl'
]);
$ctx = stream_context_create([
'http' => [
'header' => 'Authorization: Bearer ' . getenv('NODESHUB_API_KEY')
]
]);
$data = json_decode(file_get_contents($url, false, $ctx), true);
$organic = $data['data']['results']['organic_results'] ?? [];
$related = $data['data']['results']['snippets']['related_searches']['queries'] ?? [];