Nodeshub
  • Docs
  • Pricing
  • Become Affiliate
  • Use in your AI CLIClaude Code
Try for free
    Nodeshub
    • Docs
    • Pricing
    • Become Affiliate
    • Use in your AI CLIClaude Code
    Try for free
    Nodeshub
    • Docs
    • Pricing
    • Become Affiliate
    • Use in your AI CLIClaude Code
    Try for free
    HomeDocs
    HomeDocs

    Documentation

    General

    API Endpoints

    SEO Skills

    What is Nodeshub?

    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.

    Quick Start

    Method 1: API Playground

    The fastest way to try Nodeshub — no setup required. You get 100 free crawls instantly.

    1. Go to nodeshub.io and scroll to the API Playground section
    2. Your API key is generated automatically — copy it from the bottom of the playground
    3. Type a keyword (e.g. "best crm tools") and click Run
    4. See the structured JSON response in real time — organic results, People Also Ask, Knowledge Graph, and more
    5. Switch between tabs to test SERPdata, Query fan-out, and Intent Classifier

    Important — save your API key!

    • Your API key with 100 free crawls is generated automatically in the playground
    • If you need more crawls, purchase a paid plan — tokens will be added to the same key
    • Copy the key and store it somewhere safe (password manager, .env file, notes app)
    • The key is tied to your browser session — if you switch browsers or clear cookies, you won't be able to access it from the playground anymore
    • There is no user panel, no accounts, and no password recovery — your saved key is the only way to access your balance

    Method 2: cURL / Command Line

    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 analyze
    • gl — 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.

    Method 3: n8n / Make.com / Zapier (No-Code)

    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.

    Pricing & Plans

    Starter

    Try it out. No strings attached.

    Free/100 tokens

    Lite

    Perfect for small projects and testing

    $19/5000 tokens

    Basic

    Great for regular use and medium-scale projects

    $99/40 000 tokens

    BigData

    Ideal for large-scale analysis and high-volume usage

    $299/175 000 tokens

    Authorization

    How to get your API key:

    1. Visit nodeshub.io
    2. See API playground
    3. Click "Copy to clipboard" next to API key field
    4. Instantly get:
      • 100 free crawls
      • Ready-to-use cURL command
      • Sample API response

    Basic Authorization:

    Header format:

    Authorization: Bearer YOUR_API_KEY

    API Key Security Guidelines:

    • Never share publicly
    • Use environment variables in production
    • Keep safe - key tied to browser session
    • Monitor usage on nodeshub.io

    Key Features:

    • No email verification
    • No credit card required
    • No registration forms
    • Instant API access
    • 100 free crawls

    MCP – Claude Desktop Integration

    Use Nodeshub directly inside Claude Desktop with the Model Context Protocol (MCP). Search Google, analyze SERPs, and get structured data without leaving your conversation.

    1. Get your API key

    Visit nodeshub.io and copy your API key from the playground. You get 100 free crawls instantly.

    2. Open Claude Desktop config

    Open the configuration file for your OS:

    macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    Windows: %APPDATA%\Claude\claude_desktop_config.json

    3. Add MCP configuration

    Add this to your config file:

    {
      "mcpServers": {
        "nodeshub": {
          "command": "npx",
          "args": ["-y", "nodeshub-mcp"],
          "env": {
            "NODESHUB_API_KEY": "your-api-key-here"
          }
        }
      }
    }

    4. Start using

    Restart Claude Desktop and start using Nodeshub in your conversations. Try asking:

    • "Search Google for best pizza in Warsaw and analyze the results"
    • "Check what SERP features appear for keyword 'iPhone 16 review'"
    • "Track my domain position for 'web development courses'"

    No-Code Automations

    Connect Nodeshub to your favorite automation tools. Schedule SERP checks, build reports, and monitor competitors — without writing a single line of code.

    n8n

    Open-source workflow automation. Add an HTTP Request node, point it at Nodeshub, and connect to 400+ integrations.

    1. Add a Schedule Trigger node (e.g. daily or weekly)
    2. Add an HTTP Request node
    3. Set method to GET, URL: https://api.nodeshub.io/v1/search
    4. Add header: Authorization: Bearer YOUR_API_KEY
    5. Add query parameters: keyword, hl, gl, device
    6. Process the JSON response with a Set or Function node
    7. Send results to Google Sheets, Slack, Email, or any other integration

    Make.com

    Visual automation platform. Use the HTTP module to call Nodeshub and route SERP data to any app.

    1. Create a new scenario with a Schedule or Webhook trigger
    2. Add an HTTP module → Action: "Make a request"
    3. URL: https://api.nodeshub.io/v1/search?keyword=YOUR_KEYWORD&hl=en&gl=us
    4. Method: GET
    5. Headers: Authorization: Bearer YOUR_API_KEY
    6. Add a JSON module to parse the response
    7. Route data to Airtable, Notion, CRM, or any other module

    Zapier

    Connect Nodeshub to 6,000+ apps. Use Webhooks by Zapier to call the API and trigger downstream actions.

    1. Create a new Zap with a Schedule by Zapier or Webhook trigger
    2. Add a Webhooks by Zapier action → Event: "GET"
    3. URL: https://api.nodeshub.io/v1/search?keyword=YOUR_KEYWORD&hl=en&gl=us
    4. Headers: Authorization | Bearer YOUR_API_KEY
    5. Optionally add a Filter step to check for specific conditions
    6. Add a Formatter step to extract and format the data you need
    7. Send results to any connected app — Google Sheets, Slack, HubSpot, Mailchimp, and more

    Error Codes

    CodeMeaningSolution
    400Bad RequestCheck query parameters (keyword, gl, hl)
    401UnauthorizedCheck Authorization: Bearer YOUR_API_KEY
    429Too Many RequestsSlow down request rate or upgrade plan
    500Internal Server ErrorTry again later

    SERPdata API

    API Query

    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

    Query Parameters

    Required Parameters:

    ParameterTypeDescriptionExample
    keywordStringSearch phrase"best+programming+courses"

    Optional Parameters:

    ParameterTypeDescriptionExample Values
    hlStringInterface language"en", "pl", "de", "fr", "es"
    glStringGeographic location (country)"us", "pl", "de", "uk", "fr"
    deviceStringDevice type"desktop", "mobile"
    numIntegerNumber of results Currently unavailable10, 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).

    Use Cases

    SEO Analysis

    • Track rankings
    • Analyze SERP features

    Competitor Monitoring

    • Monitor competitor positions
    • Analyze competitor strategies

    Content Strategy

    • Find related searches
    • Discover popular questions

    Market Research

    • Analyze product trends
    • Investigate pricing dynamics

    Automation

    • Integrate with existing tools
    • Create workflow pipelines

    Response Structure

    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 – your window to Google

    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.

    AI Overviews

    An AI-generated summary by Google that provides a synthesized answer to a user's query.

    Business Use Cases:

    • Understand search intent
    • Monitor how AI summaries affect click-through rate (CTR)
    • Create E-E-A-T optimized content
    • Track AI content patterns and sources
    • Optimize for AI Overview inclusion

    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..."
      }
    }

    Ads

    Paid Google Advertisements that appear at the top of search results.

    Business Applications:

    • Monitor advertising competition
    • Analyze competitor pricing strategies
    • Track companies paying for specific keywords
    • Analyze ad titles and descriptions
    • Plan Google Ads campaigns

    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://..." }
          ]
        }
      ]
    }

    People Also Ask

    A dynamic section showing related questions that users frequently ask.

    Business Use Cases:

    • Understand user search intent
    • Discover content ideas
    • Identify common user questions
    • Optimize content for long-tail keywords
    • Improve FAQ and help center content

    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
      }
    }

    Knowledge Graph

    A Google feature that provides quick, structured information about entities like people, places, or things.

    Business Use Cases:

    • Understand entity relationships
    • Track brand knowledge representation
    • Analyze semantic search capabilities
    • Optimize content for knowledge panel inclusion

    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
      }
    }

    Local Pack

    A map-based snippet showing local businesses related to a search query. Access via data.results.snippets.local_pack.

    Business Use Cases:

    • Local SEO analysis
    • Competitor location tracking
    • Understanding geographic business visibility
    • Local market research

    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
        }
      ]
    }

    Things to Know

    Quick answers to popular questions related to the query. Access via data.results.snippets.things_to_know.

    • Identify key aspects of a topic
    • Create landing pages that answer key questions
    • Optimize content for featured snippets

    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
      }
    }

    Related Searches

    Related searches suggested by Google at the bottom of results. Use data.results.snippets.related_searches.queries.

    • Automated keyword research
    • Discovering long-tail keywords
    • Planning site structure

    JSON Preview

    {
      "related_searches": {
        "queries": [
          "best pizza delivery warsaw",
          "pizza near me open now",
          "neapolitan pizza warsaw",
          "pizza warszawa ranking"
        ],
        "rank_absolute": 12
      }
    }

    Perspectives

    Posts and insights from Reddit, YouTube, Quora, etc. Access via data.results.snippets.perspectives.

    • Analyze user-generated feedback
    • Track brand sentiment
    • Identify influencers and discussions

    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
        }
      ]
    }

    Refine Chips

    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 Results

    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
        }
      ]
    }

    Featured Snippets

    Highlighted answer box at the top of search results with extracted content. Access via data.results.snippets.featured_snippets.

    • Track position zero rankings
    • Analyze featured snippet content structure
    • Identify paragraph, list, and table snippet types

    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
        }
      ]
    }

    Top Stories

    Recent news articles related to the search query. Access via data.results.snippets.top_stories.

    • News monitoring and media tracking
    • Trending topic identification
    • Content freshness analysis

    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
            }
          ]
        }
      ]
    }

    Videos Pack

    Video results carousel from YouTube and other sources. Access via data.results.snippets.videos_pack.

    • Video content strategy insights
    • Competitor video analysis
    • Track video ranking positions

    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
            }
          ]
        }
      ]
    }

    Popular Products

    Product carousels with prices, ratings, and merchant info. Access via data.results.snippets.popular_products.

    • Monitor competitor pricing
    • Track product availability and ratings
    • Analyze merchant distribution

    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
            }
          ]
        }
      ]
    }

    Images Pack

    Image results carousel embedded in search results. Access via data.results.snippets.images_pack.

    • Track image search visibility
    • Monitor visual content rankings
    • Analyze image SEO opportunities

    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
            }
          ]
        }
      ]
    }

    Discussions & Forums

    Forum posts and community discussions from Reddit, Quora, and other platforms. Access via data.results.snippets.discussions_and_forums.

    • Monitor community sentiment
    • Identify user pain points and needs
    • Find content opportunities from real discussions

    JSON Preview

    {
      "discussions_and_forums": [
        {
          "answer_count_text": "80+ comments",
          "details": "r/samsung · 80+ comments · 1 month ago",
          "rank_inner": 1
        }
      ]
    }

    Scholarly Articles

    Academic papers from Google Scholar embedded in search results. Access via data.results.snippets.scholarly_articles.

    • Monitor academic discourse in your industry
    • Track research trends and citations
    • Identify authoritative sources for content

    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
        }
      ]
    }

    Product Info Right

    Detailed product panel on the right side of results with description, filters, and merchant offers. Access via data.results.snippets.product_info_right.

    • Monitor product detail visibility
    • Track pricing across merchants
    • Analyze product filters shown by Google

    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/..."
          }
        ]
      }
    }

    People Also Search Products

    Related product suggestions shown for product queries. Access via data.results.snippets.people_also_search_products.

    • Discover related products in your market
    • Track cross-product shopping behavior
    • Identify competitor product positioning

    JSON Preview

    {
      "people_also_search_products": [
        {
          "products": [
            {
              "name": "Samsung Galaxy S25+",
              "image_url": "https://...",
              "position": 1,
              "url": "https://google.com/search?q=..."
            }
          ]
        }
      ]
    }

    Stores Nearby

    Local store listings with availability for product queries. Access via data.results.snippets.stores_nearby.

    • Track local product availability
    • Monitor brick-and-mortar competitors
    • Analyze local vs online presence

    JSON Preview

    {
      "stores_nearby": [
        {
          "store_name": "Best Buy",
          "address": "123 Main St",
          "availability": "In stock",
          "price": "$799.99"
        }
      ]
    }

    Organic Results – TOP 10 analysis

    Organic results are in data.results.organic_results. Each item has pos, global_pos, title, url, domain, description.

    1. Position tracking

    // 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);

    2. SERP features analysis

    // 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;
    }

    3. Competitor analysis

    // 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);

    Pro Tips

    Query strategy

    • Batch requests – group similar keywords to reduce calls
    • Match gl/hl – use parameters that match your target market
    • Monitor usage – stay within your plan limits

    Handle responses efficiently

    • Parse only the snippet types you need
    • Cache results for frequently checked phrases
    • Implement retry logic for failed requests

    Scale your applications

    • Use webhooks for real-time monitoring
    • Implement queuing for high-volume requests
    • Track crawl consumption and upgrade when needed

    Data analysis best practices

    • Focus on trends over time, not single snapshots
    • Combine SERP data with your analytics
    • Automate alerts for significant ranking changes

    Code Examples

    cURL

    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"

    JavaScript/Node.js

    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 ?? [];

    Python

    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", [])

    PHP

    $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'] ?? [];

    Intent Classifier API

    Coming Soon

    Intent Classifier

    Classify search intent for any keyword in real time. Determine whether a query is informational, navigational, commercial, or transactional — and use that signal to prioritize content strategy.

    2 tokens/queryUltra-low cost intent classification

    Query Fan-out API

    The Query Fan-out endpoint takes a single seed keyword and expands it into a diverse set of related search queries. It analyzes real-time SERP data to generate keyword variations with different intents, specificity levels, and angles — perfect for content planning, keyword research, and building comprehensive topic clusters.

    ✨

    AI-powered keyword expansion

    Unlike simple keyword suggestions, Query Fan-out uses AI to understand search intent and generate semantically diverse variations — including comparative queries, follow-up questions, entity expansions, and implicit user needs that traditional tools miss.

    Endpoint & Parameters

    Endpoint: https://api.nodeshub.io/v1/query-fanout

    Method: GET

    Request Structure:

    GET https://api.nodeshub.io/v1/query-fanout?keyword=seo+tools&hl=en&mode=standard&add_questions=true&add_topic_leaders=false&include_reasoning=false
    Authorization: Bearer YOUR_API_KEY

    Required Parameters:

    ParameterTypeDescriptionExample
    keywordStringSeed keyword to expand"seo+tools"
    hlStringLanguage code for results"en", "pl", "de"

    Optional Parameters:

    ParameterTypeDefaultDescription
    modeString"standard""standard" (7.5 tokens) or "reasoning" (30 tokens) — reasoning mode produces more variants with explanations
    add_questionsBooleantrueInclude question-style keyword variants in results
    add_topic_leadersBooleanfalseEnrich results with top-ranking page titles from SERP
    include_reasoningBooleanfalseInclude AI reasoning for each variant (only works in reasoning mode)

    Token cost: Standard mode costs 7.5 tokens per query. Reasoning mode costs 30 tokens per query but generates more diverse variants with detailed explanations.

    Response Structure

    Standard Mode Response:

    {
      "seed_keyword": "Pressure washer",
      "generated_variants": [
        {
          "keyword": "best pressure washers",
          "type": "related",
          "confidence": 0.9
        },
        {
          "keyword": "electric pressure washer",
          "type": "specification",
          "confidence": 0.85
        },
        {
          "keyword": "pressure washer vs power washer",
          "type": "comparative",
          "confidence": 0.7
        }
        // ... more variants
      ],
      "total_generated": 15,
      "metadata": {
        "generation_time_ms": 10959,
        "mode": "standard",
        "serp_queries_executed": 1,
        "unique_questions_found": 0,
        "generated_variants_count": 15
      },
      "top_titles": [
        "Pressure Washers",
        "Pressure Washers & Accessories",
        "Commercial & Industrial Pressure Washers"
      ]
    }

    Reasoning Mode Response:

    In reasoning mode, each variant includes a reasoning field explaining why it was generated:

    {
      "seed_keyword": "SEO tools",
      "generated_variants": [
        {
          "keyword": "free SEO tools for website analysis",
          "type": "specification",
          "confidence": 0.95,
          "reasoning": "Combines the 'free' aspect highlighted in SERP titles with a specific use case ('website analysis'), making the query more precise."
        },
        {
          "keyword": "SEO software comparison",
          "type": "comparative",
          "confidence": 0.9,
          "reasoning": "Indicates a user in the decision-making phase, looking to compare different SEO solutions."
        },
        {
          "keyword": "best SEO tools 2026",
          "type": "recent",
          "confidence": 0.9,
          "reasoning": "Incorporates the current year to find the most up-to-date recommendations."
        }
        // ... more variants (typically 15-20)
      ],
      "total_generated": 20,
      "metadata": {
        "generation_time_ms": 17114,
        "mode": "reasoning",
        "serp_queries_executed": 1,
        "unique_questions_found": 0,
        "generated_variants_count": 20
      },
      "top_titles": [
        "Free SEO Tools by Moz | Try Premium SEO Checkers for Free",
        "100% Free SEO Tools - SmallSEOTools.com",
        "The 11 best SEO tools"
      ]
    }

    Response Fields:

    FieldTypeDescription
    seed_keywordStringThe original keyword you submitted
    generated_variantsArrayList of expanded keyword objects
    generated_variants[].keywordStringThe generated keyword variation
    generated_variants[].typeStringClassification of the variant (see Variant Types below)
    generated_variants[].confidenceNumberRelevance score from 0.0 to 1.0
    generated_variants[].reasoningStringAI explanation for the variant (reasoning mode only)
    total_generatedNumberTotal number of variants generated
    metadataObjectProcessing metadata (timing, mode, counts)
    top_titlesArrayTop-ranking page titles from SERP used for context

    Variant Types

    Each generated keyword is classified into one of the following types, helping you understand the search intent and use it strategically:

    related

    Semantically related queries that share the same topic space.

    Example: "pressure washer" → "pressure washer accessories"

    specification

    More specific versions of the seed keyword — narrowed by feature, use case, or type.

    Example: "pressure washer" → "electric pressure washer"

    implicit

    Unstated but likely user needs inferred from the seed keyword.

    Example: "pressure washer" → "pressure washer for home use"

    comparative

    Queries comparing alternatives, often used in decision-making.

    Example: "pressure washer" → "pressure washer vs power washer"

    follow_up

    Questions users typically ask after the initial search.

    Example: "pressure washer" → "how to use a pressure washer"

    reformulation

    Rephrased versions of the same intent using different wording.

    Example: "SEO tools" → "best free SEO checkers"

    entity_expanded

    Expanded around specific entities (brands, products) found in SERP.

    Example: "SEO tools" → "alternatives to Moz SEO tools"

    entailment

    Logically implied topics that follow from the seed keyword.

    Example: "pressure washer" → "pressure washer maintenance"

    generalization

    Broader versions of the query, widening the topic scope.

    Example: "seo tools" → "what is an seo tool"

    personalized

    Location-aware or user-context queries.

    Example: "cat" → "cats for adoption near me"

    recent

    Time-sensitive queries incorporating recency.

    Example: "SEO tools" → "best SEO tools 2026"

    clarification

    Disambiguating queries when the keyword has multiple meanings.

    Example: "jaguar" → "jaguar car" / "jaguar animal"

    Standard vs Reasoning Mode

    Standard Mode

    7.5 tokens/query
    • ✓ ~15 keyword variants per query
    • ✓ Fast response (~10-15 seconds)
    • ✓ Keyword, type, and confidence score
    • ✓ Best for bulk keyword expansion
    • ✗ No reasoning explanations

    Reasoning Mode

    30 tokens/query
    • ✓ ~20 keyword variants per query
    • ✓ Detailed AI reasoning per variant
    • ✓ Higher quality variant selection
    • ✓ Best for content strategy planning
    • ✓ Explains why each variant matters

    Code Examples

    cURL

    curl --request GET \
      --url 'https://api.nodeshub.io/v1/query-fanout?keyword=seo+tools&hl=en&mode=standard&add_questions=true&add_topic_leaders=false&include_reasoning=false' \
      --header 'Authorization: Bearer YOUR_API_KEY'

    JavaScript / Node.js

    const params = new URLSearchParams({
      keyword: 'seo tools',
      hl: 'en',
      mode: 'standard',       // or 'reasoning'
      add_questions: 'true',
      add_topic_leaders: 'false',
      include_reasoning: 'false'
    });
    
    const res = await fetch(
      `https://api.nodeshub.io/v1/query-fanout?${params}`,
      { headers: { Authorization: 'Bearer YOUR_API_KEY' } }
    );
    const data = await res.json();
    
    // Access generated variants
    data.generated_variants.forEach(v => {
      console.log(`[${v.type}] ${v.keyword} (confidence: ${v.confidence})`);
    });

    Python

    import requests
    
    params = {
        'keyword': 'seo tools',
        'hl': 'en',
        'mode': 'reasoning',
        'add_questions': 'true',
        'add_topic_leaders': 'true',
        'include_reasoning': 'true'
    }
    
    resp = requests.get(
        'https://api.nodeshub.io/v1/query-fanout',
        params=params,
        headers={'Authorization': 'Bearer YOUR_API_KEY'},
        timeout=30
    )
    data = resp.json()
    
    for variant in data['generated_variants']:
        print(f"[{variant['type']}] {variant['keyword']}")
        if 'reasoning' in variant:
            print(f"  → {variant['reasoning']}")
        print(f"  Confidence: {variant['confidence']}")

    Use Cases

    1. Content Cluster Planning

    Use variant types to build structured topic clusters around a pillar keyword:

    function buildContentCluster(fanoutResponse) {
      const cluster = {
        pillar: fanoutResponse.seed_keyword,
        supporting: [],
        faq: [],
        comparisons: []
      };
    
      for (const v of fanoutResponse.generated_variants) {
        if (v.type === 'specification' || v.type === 'related') {
          cluster.supporting.push(v.keyword);
        } else if (v.type === 'follow_up' || v.type === 'implicit') {
          cluster.faq.push(v.keyword);
        } else if (v.type === 'comparative') {
          cluster.comparisons.push(v.keyword);
        }
      }
      return cluster;
    }

    2. Keyword Prioritization

    Sort variants by confidence to prioritize the most relevant keywords:

    function prioritizeKeywords(fanoutResponse, minConfidence = 0.8) {
      return fanoutResponse.generated_variants
        .filter(v => v.confidence >= minConfidence)
        .sort((a, b) => b.confidence - a.confidence)
        .map(v => ({
          keyword: v.keyword,
          type: v.type,
          confidence: v.confidence
        }));
    }

    3. Combine with SERPdata Search

    Fan out a keyword, then fetch SERP data for each variant:

    async function deepResearch(keyword, apiKey) {
      // Step 1: Expand the keyword
      const fanout = await fetch(
        `https://api.nodeshub.io/v1/query-fanout?keyword=${encodeURIComponent(keyword)}&hl=en&mode=standard&add_questions=true&add_topic_leaders=false&include_reasoning=false`,
        { headers: { Authorization: `Bearer ${apiKey}` } }
      ).then(r => r.json());
    
      // Step 2: Get SERP data for top variants
      const topVariants = fanout.generated_variants
        .filter(v => v.confidence >= 0.85)
        .slice(0, 5);
    
      const results = [];
      for (const variant of topVariants) {
        const serp = await fetch(
          `https://api.nodeshub.io/v1/search?keyword=${encodeURIComponent(variant.keyword)}&gl=us&hl=en`,
          { headers: { Authorization: `Bearer ${apiKey}` } }
        ).then(r => r.json());
    
        results.push({
          keyword: variant.keyword,
          type: variant.type,
          serp_data: serp
        });
      }
      return results;
    }

    SEO Skills

    An open-source toolkit of ready-made SEO skills for Claude Code, Gemini CLI, or any AI CLI. Each skill works on two layers:

    • SKILL.md layer — slash-command integration for Claude Code (automatic context, structured output).
    • Python scripts layer — fully standalone. Run from any terminal, CI pipeline, or other AI tool (Gemini CLI, Cursor, Aider).

    SERP data is fetched live from Google (not from a historical database), so results reflect the current state of search. The skills follow the open Agent Skills standard, making them portable across compatible tools.

    What This Repository Is

    This repository is a promotional package created by Senuto to demonstrate the capabilities of the NodesHub platform. It is a collection of instructions (SKILL.md files), Python scripts, and configuration templates that extend Claude Code with SEO-related functionality.

    It is not a standalone application. Here is how it works:

    1. The user installs Claude Code (a paid Anthropic product).
    2. The user downloads this repo from the public GitHub repository.
    3. The user navigates to the repository folder in their terminal.
    4. The user types commands such as /nod-serp-analysis "keyword" — Claude Code reads the included instructions and performs the analysis.
    5. In the background, Python scripts connect to the NodesHub API to fetch SERP data, and Claude Code interprets and presents the results.

    For Business Users Only

    This repository and the NodesHub platform it connects to are intended exclusively for professional and business use. Access to NodesHub is governed solely by the NodesHub Terms of Service, available at nodeshub.io.

    Quick Start

    1. Open your terminal

    Open a terminal, VS Code, Cursor, or any editor with an integrated terminal.

    2. Clone the repo

    git clone https://github.com/Senuto/nodeshub-seo-skills

    3. Enter the folder

    cd nodeshub-seo-skills

    Important: always launch your AI CLI from inside this folder. Skills are discovered from .claude/skills/ relative to your working directory.

    4. Open Claude Code

    claude

    Works with Claude Code, Gemini CLI, Cursor, Aider, and any AI CLI that supports slash commands.

    5. Run /guide

    Type /guide to get an overview of all available skills and agents, and to check the connection status of all APIs (NodesHub, OpenRouter, Genuino, Jina, GSC, GA4).

    6. Connect APIs

    Connect NodesHub and any optional services using dedicated skills:

    • /connect-nodeshub — required, provides live SERP data
    • /connect-openrouter — optional, for clustering and content briefs
    • /connect-genuino — optional, for AI Score and humanization
    • /connect-gsc — optional, Google Search Console
    • /connect-ga4 — optional, Google Analytics 4

    7. All set — have fun!

    Everything is ready. Start running skills like /nod-serp-analysis, /nod-keyword-research, and more.

    Requirements

    • Claude Code — for full integration (slash commands, automatic context). Alternatively, scripts can be run manually from any terminal.
    • Python 3.9+ — to run the scripts.
    • NodesHub API key — to fetch SERP data (free 100 tokens included upon registration).
    • OpenRouter API key (optional) — required for SERP Clusters (naming), PAA Miner (clustering), and Topic Planner (briefs).
    • Genuino API key (optional) — required for AI Score, Keyword to Publish, and Content Humanizer.
    • Jina API key (optional) — for crawling competitor pages in Topic Planner and for URL-based AI Score analysis.

    Configuration

    Connecting NodesHub

    1. Go to nodeshub.io and scroll to the API Playground section.
    2. Click "Copy to clipboard" to copy your API key.
    3. Save the key using one of three methods:
      • Via Claude Code: type /connect-nodeshub and enter your key.
      • Manually: python3 .claude/skills/nod-nodeshub-api/scripts/save_key.py YOUR_KEY
      • Environment variable: export NODESHUB_API_KEY=YOUR_KEY

    Verification:

    python3 .claude/skills/nod-nodeshub-api/scripts/check_setup.py

    Connecting OpenRouter (optional)

    1. Go to openrouter.ai/keys and generate a key.
    2. Run: python3 .claude/skills/nod-nodeshub-api/scripts/save_openrouter_key.py YOUR_KEY
    3. Or type /connect-openrouter in Claude Code for a guided setup.

    Connecting Genuino (optional)

    1. Go to genuino.ai and obtain an API key.
    2. Type /connect-genuino in Claude Code for a guided setup.

    Connecting Google Search Console (optional)

    Type /connect-gsc in Claude Code — it will walk you through the OAuth setup step by step.

    What it unlocks: pulls real search queries, impressions, clicks, and average positions from your GSC property. Skills can then cross-reference SERP data with your actual performance.

    Connecting Google Analytics 4 (optional)

    Type /connect-ga4 in Claude Code — it will walk you through the OAuth setup step by step.

    What it unlocks: pulls pageviews, sessions, traffic sources, and events from your GA4 property. Useful for correlating keyword rankings with actual traffic and conversions.

    Tokens & Costs

    Each NodesHub API call costs tokens. New users receive 100 free tokens upon registration. Genuino features are billed separately in Genuino credits.

    Check your balance:

    python3 .claude/skills/nod-nodeshub-api/scripts/balance.py
    OperationCost
    Fetch SERP (1 keyword)1 token
    Query Fan-out standard (1 keyword)7.5 tokens
    Query Fan-out reasoning (1 keyword)30 tokens
    Intent Classifier2 tokens per keyword
    Content Brief / Audit~8.5 tokens
    AI Score (Genuino)1 Genuino credit (base) + optional 2 for guidelines + 2 for humanization prompt
    Check balance0
    List countries/languages0

    Research & Analysis

    1. SERP Analysis /nod-serp-analysis

    Fetches and analyzes the top 10 Google results for a given keyword. Before running, the skill asks for keyword, market (gl/hl), and device — desktop and mobile SERPs can differ significantly.

    What you get:

    • A list of 10 organic results (domain, title, content type).
    • SERP features present (PAA, AI Overview, Knowledge Panel, Local Pack, Videos).
    • Search intent classification (informational / commercial / transactional / navigational).
    • Gaps in the results — what's missing from the current top 10.
    • Recommendations.

    Cost: 1 token per keyword.

    When to use: When you want to see who's ranking for a keyword, which SERP features appear, and what the competitive landscape looks like.

    # Claude Code
    /nod-serp-analysis
    > Analyze the SERP for "website SEO" gl=us hl=en device=desktop
    
    # Terminal
    python3 .claude/skills/nod-nodeshub-api/scripts/serpdata.py "website SEO" --gl us --hl en --device desktop

    2. Keyword Research /nod-keyword-research

    Expands a single seed keyword into a full list of related phrases, questions, long-tail variants, and topic clusters.

    Two modes:

    A) Iterative Research (recommended) — fetches the SERP for the seed, extracts PAA questions and related searches, then repeats for discovered phrases.

    PresetLoopsCostKeywords
    conservative3~22 tokens50–150
    standard5~72 tokens150–400
    aggressive15~262 tokens400–1,000+
    beast30~637 tokens1,000–3,000+

    B) Simple Fan-out — a single API call returning related phrases, questions, and variants. Faster, but shallower. Cost: 7.5 tokens (standard) / 30 (reasoning).

    Output: A CSV file saved to output/data/keywords/{keyword_slug}/ with columns: keyword, source, type, discovered_in_loop, serp_overlap.

    3. SERP Clusters /nod-serp-clusters

    Groups a list of keywords based on the similarity of their Google results. If two keywords share similar top-10 results, they end up in the same cluster — meaning they can be covered on one page.

    Two clustering methods:

    • A) SERP-based (default) — compares Google results across keywords (Weighted Jaccard + Louvain). Cost: 1 token per keyword.
    • B) Semantic — groups keywords by meaning using an LLM. Cost: 0 NodesHub tokens, only OpenRouter.

    Cluster levels: --levels 1 (single layer, default), --levels 2 (broad + detailed), --levels 3 (broad + medium + detailed).

    Reports: --report html (interactive D3.js dendrogram) or --report md (Markdown).

    Requires: NodesHub key + OpenRouter key.

    4. Intent Classifier /nod-intent-classifier

    Classifies search intent based on SERP signals — not on the phrase itself, but on what Google actually shows.

    Four categories:

    • Informational — the user is looking for knowledge (PAA, AI Overview, how-to guides).
    • Commercial — comparing options (reviews, "best X", ads).
    • Transactional — ready to buy (Shopping, prices, products).
    • Navigational — looking for a specific page (brand ranked #1).

    Cost: 1 token per keyword. Each keyword receives a percentage confidence score.

    5. PAA Miner /nod-paa-miner

    Extracts "People Also Ask" questions from Google for a list of keywords, deduplicates them, and optionally clusters them by topic using an LLM.

    • A bank of unique questions with information about which keywords they appeared for.
    • Optional grouping of questions into topics (requires OpenRouter).

    Output saved to: output/data/paa/{slug}_{date}.json — automatically after each run.

    Cost: 1 token per keyword + optional OpenRouter for clustering. Keywords are fetched concurrently for faster results. When to use: When building a FAQ section, looking for questions to answer in your content, or planning an article's structure.

    6. Featured Snippet Hunter /nod-featured-snippet-hunter

    Finds Featured Snippet (position zero) opportunities for your domain.

    Classifies opportunities as:

    • Steal — a snippet exists, you rank in the top 10, but don't own the snippet (best opportunity).
    • Defend — you own the snippet; monitor it.
    • Target — a snippet exists, but you're not in the top 10 (harder to win).
    • No snippet — no answer box present.

    Cost: 1 token per keyword.

    Tracking & Monitoring

    7. Rank Tracker /nod-rank-tracker

    Checks where your domain ranks for given keywords. Saves snapshots and compares changes over time.

    Output: A table with positions, changes (up/down), and the URLs that are ranking.

    Data saved to: output/data/rank-history/{domain}/{YYYY-MM-DD}.json

    Performance: Keywords are fetched concurrently (up to 5 in parallel) — ~2× faster on large lists.

    Cost: 1 token per keyword. Recommended frequency: once a week.

    8. Competitor Tracker /nod-competitor-tracker

    Shows who is ranking for your target keywords. Displays domain frequency in the top 10, average positions, and a keyword × domain matrix.

    Key difference vs. Rank Tracker: Rank Tracker monitors your domain. Competitor Tracker shows everyone ranking (or specific domains via --watch).

    Data saved to: output/data/competitor-tracking/{YYYY-MM-DD}.json

    Performance: Keywords are fetched concurrently (up to 5 in parallel).

    Cost: 1 token per keyword.

    9. Visibility Monitor /nod-visibility-monitor

    Calculates an SEO visibility score for a domain based on weighted positions. Position #1 = 10 pts, #2 = 9, ..., #8–10 = 2, outside top 10 = 0. The score is expressed as a percentage of the maximum possible visibility.

    You can benchmark against competitors — add competitor domains to see who has greater visibility across a given keyword set.

    Data saved to: output/data/visibility/{domain}/{YYYY-MM-DD}.json

    Performance: Keywords are fetched concurrently (up to 5 in parallel).

    Cost: 1 token per keyword. Useful for reporting.

    Content

    10. Content Brief /nod-content-brief

    Generates a complete content brief for writing an article. Combines SERP data with keyword expansion to produce a comprehensive plan.

    The brief includes:

    • Primary and secondary keywords.
    • Analysis of the top 5 competitors (strengths, gaps).
    • Suggested heading structure (H1, H2, H3).
    • Questions to answer (from PAA and fan-out).
    • Requirements: length, must-cover topics, schema, meta tags.
    • An SEO checklist.

    Output saved to: output/data/briefs/{slug}.md — automatically after each run.

    Cost: ~8.5 tokens (standard) / ~31 (reasoning) per brief.

    11. Content Auditor /nod-content-auditor

    Audits an existing page against current Google results and identifies what's missing compared to what's ranking.

    • Missing keywords, questions, and topics.
    • Content gaps vs. the competition.
    • Recommendations: what to add, what to improve, and in what order.

    Pass --raw to get clean JSON output on stdout (progress messages go to stderr).

    Cost: ~8.5 tokens (standard) / ~31 (reasoning).

    Content Quality

    12. AI Score /ai-score

    Analyzes text for the probability of being AI-generated using the Genuino API.

    What you get:

    • AI probability score (0–100%).
    • Writing style classification.
    • Optional humanization guidelines: which sections sound most artificial and why.
    • Optional humanization prompt: rewrite instructions for flagged sections.

    Supports three input methods: text files, inline text (minimum 200 words), and URLs (fetched via Jina Reader).

    Cost: 1 Genuino credit per analysis. +2 credits for guidelines. +2 credits for humanization prompt. Requires: Genuino API key. Jina API key optional (for URL analysis).

    # Claude Code
    /ai-score
    > Check this article: article.txt
    
    # Terminal
    python3 .claude/skills/ai-score/scripts/analyze.py --file article.txt --guidelines

    Agents

    Agents are orchestrators that compose multiple skills into end-to-end pipelines. Unlike skills (single-purpose tools), agents run multi-step workflows with user interaction between steps. Each agent saves progress per step and can be resumed from any point.

    Topic Planner /topic-planner

    Orchestrates the entire pipeline from a seed keyword to finished content briefs. Combines three steps into a single run with progress reporting between stages:

    1. Keyword Research — collects keywords (iterative research).
    2. Clustering — groups keywords (SERP-based or semantic).
    3. Content Briefs — crawls competitors (Jina) and generates briefs (OpenRouter).

    Resumable — each step saves its results to output/data/topics/[slug]/. You can stop and pick up where you left off.

    Cost: ~25 tokens (keywords) + ~1 token/keyword (clustering) + OpenRouter (briefs). Requires: NodesHub key + OpenRouter key. Jina is optional.

    Keyword to Publish /keyword-to-publish

    Runs the full pipeline from a seed keyword to a publish-ready article:

    1. Keyword Research — discovers related keywords.
    2. SERP Analysis — analyzes the competitive landscape.
    3. Content Brief — generates a writing plan.
    4. Article Writing — Claude writes the article based on the brief.
    5. AI Score Check — Genuino verifies the text reads as human-written. If the score exceeds the threshold, Claude rewrites flagged sections.
    6. Content Audit — compares the final article against the competition.

    Results saved to: output/data/articles/{slug}/ — one subfolder per article with keywords, brief, and final article.

    Applies brand context from docs/ automatically if filled in (voice, tone, audiences).

    Cost: ~40–80 NodesHub tokens + Genuino credits. Requires: NodesHub key + Genuino key.

    Content Humanizer /content-humanizer

    Iteratively rewrites AI-generated text until it passes AI detection:

    1. Analyzes the text with Genuino — identifies AI probability and flagged sections.
    2. Rewrites only the flagged sections — the rest stays untouched.
    3. Re-checks the score — repeats until AI probability drops below the threshold.
    4. Stops after a maximum of 3 iterations to avoid infinite loops.

    Cost: 1–3 Genuino credits per iteration. Requires: Genuino key.

    Use Cases

    Scenario 1: Planning new content (manual)

    1. /nod-keyword-research — collect keywords (standard preset).
    2. /nod-serp-clusters — group keywords into clusters.
    3. /nod-content-brief — create a brief for each cluster.
    4. Write content based on the briefs.

    Scenario 1b: Planning new content (automated)

    /topic-planner — provide a seed keyword; the agent handles everything.

    Scenario 2: Optimizing existing content

    1. /nod-content-auditor — identify what's missing vs. the competition.
    2. Update the content based on recommendations.
    3. /nod-rank-tracker — monitor ranking changes after publishing.

    Scenario 3: Competitive analysis

    1. /nod-competitor-tracker — see who ranks for your keywords.
    2. /nod-visibility-monitor — compare your visibility against competitors.
    3. /nod-serp-analysis — dive deeper into specific phrases.

    Scenario 4: Quick reconnaissance

    1. /nod-serp-analysis — check who ranks and what the SERP looks like.
    2. /nod-intent-classifier — determine which content type fits the intent.

    Scenario 5: Winning Featured Snippets

    1. /nod-featured-snippet-hunter — find snippet opportunities.
    2. /nod-paa-miner — collect PAA questions for a FAQ section.
    3. Optimize content for snippets (lists, tables, definitions).

    Scenario 6: Writing an article from scratch (automated)

    /keyword-to-publish — provide a seed keyword; the agent handles research, writing, AI check, and audit.

    Scenario 7: Humanizing AI content

    1. /ai-score — check the current AI probability.
    2. /content-humanizer — if the score is too high, the agent rewrites flagged sections automatically.

    Shared Parameters

    Most skills accept the same parameters:

    ParameterDescriptionExample
    --glCountry code (Google geolocation)pl, us, de, uk
    --hlLanguage code (Google host language)pl, en, de
    --deviceDevice typedesktop, mobile
    --fileFile with keywords (one per line)keywords.txt
    --rawReturn raw JSON—
    --compareCompare with previous snapshot—

    List supported country and language codes:

    python3 .claude/skills/nod-nodeshub-api/scripts/params.py countries
    python3 .claude/skills/nod-nodeshub-api/scripts/params.py languages

    Tips & Advanced Usage

    How to personalize HTML reports

    Skills that support HTML output generate interactive reports saved to output/reports/. Each skill lets you choose: create a new report or append a section to an existing one. To brand them:

    1. Drop your logo and CSS overrides into assets/branding/.
    2. Run a skill with --report html.
    3. The branded report lands in output/reports/ — open it in a browser or send directly to a client.

    To combine multiple skills into one report, use append_section(report_path, section_html) — each skill run adds a new section without overwriting previous ones.

    Where data from each skill is saved

    All skill output is saved under output/ inside the repo folder. The entire folder is gitignored:

    • output/data/rank-history/{domain}/{YYYY-MM-DD}.json — Rank Tracker snapshots
    • output/data/competitor-tracking/{YYYY-MM-DD}.json — Competitor Tracker snapshots
    • output/data/visibility/{domain}/{YYYY-MM-DD}.json — Visibility Monitor snapshots
    • output/data/topics/{slug}/ — Topic Planner results
    • output/data/articles/{slug}/ — Keyword to Publish results
    • output/data/keywords/{slug}/ — Keyword Research output
    • output/data/briefs/{slug}.md — Content Brief auto-saves
    • output/data/paa/{slug}_{date}.json — PAA Miner results
    • output/data/serp-cache/ — SERP cache shared across all skills
    • output/reports/ — HTML and Markdown reports

    Data accumulates between sessions — you can compare runs, review history, and resume agents from any step.

    What can you do with the /docs folder

    The /docs folder contains editable Markdown templates for your brand context. Claude Code reads these files automatically at the start of every session, so all generated content (briefs, audits, articles) is aligned with your brand from the start.

    • audiences.md — your target segments and personas
    • brand-guidelines.md — logo, colors, typography, components
    • competitors.md — direct/indirect competitors, positioning
    • product.md — overview, key features, value proposition, pricing
    • proof-points.md — statistics, case studies, testimonials
    • voice-tone.md — brand voice, tone guidelines, do's and don'ts

    Fill these in once and every skill output will automatically reflect your brand.

    settings.local.json

    The repo ships with .claude/settings.local.json.example. After cloning, rename it manually:

    mv .claude/settings.local.json.example .claude/settings.local.json

    Open the file and fill in your keys:

    {
      "env": {
        "NODESHUB_API_KEY": "",
        "OPENROUTER_API_KEY": "",
        "GENUINO_API_KEY": "",
        "JINA_API_KEY": ""
      }
    }

    Store API keys here, not in the chat

    Never paste API keys directly into the conversation — they may end up in conversation history. .claude/settings.local.json is gitignored and will never be committed to the repository.

    Caching

    SERP results are cached locally to avoid redundant API calls and save tokens. The cache is shared across all skills — if you run two different skills on the same keyword list, only the first skill fetches from the API. Cache entries expire automatically after 24 hours and are stored in output/data/serp-cache/{gl}-{hl}/{keyword}.json.

    To change the TTL, edit DEFAULT_TTL_HOURS in:

    .claude/skills/nod-nodeshub-api/scripts/serp_cache.py

    To force a fresh fetch immediately, pass --no-cache to any skill.

    Frequently Asked Questions

    Nodeshub

    Senuto Sp. z o.o.

    ul. Dominikańska 13

    02-738 Warszawa

    VAT ID: PL9512367837

    Products

    • Nodeshub

    Additional services

    • Senuto
    • Enterprise Products

    Help

    • Terms of Service
    • Privacy Policy

    © 2026 Senuto. All rights reserved.