Connect Your Website

Link your GitHub repository to start analyzing your content structure, topical authority, and SEO opportunities. The platform auto-detects your tech stack and content directories.

Time to complete: 5 minutes


🚀 Quick Start

Step 1: Start Onboarding

curl -X POST https://api.contentglowz.com/api/projects/onboard \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "github_url": "https://github.com/yourusername/your-website"
  }'

Response:

{
  "project_id": "proj_abc123",
  "status": "cloning",
  "message": "Project 'your-website' created. Ready for analysis."
}

Step 2: Analyze Repository

curl -X POST https://api.contentglowz.com/api/projects/proj_abc123/analyze \
  -H "Authorization: Bearer YOUR_API_KEY"

Response:

{
  "project_id": "proj_abc123",
  "tech_stack": {
    "framework": "astro",
    "framework_version": "5.0.0",
    "package_manager": "pnpm",
    "confidence": 0.95
  },
  "content_directories": ["src/content", "src/pages"],
  "suggested_content_dir": "src/content",
  "total_content_files": 47,
  "framework_config_found": true
}

Step 3: Confirm Settings

Accept auto-detected settings:

curl -X POST https://api.contentglowz.com/api/projects/proj_abc123/confirm \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "project_id": "proj_abc123",
    "confirmed": true
  }'

Or override content directory:

curl -X POST https://api.contentglowz.com/api/projects/proj_abc123/confirm \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "project_id": "proj_abc123",
    "confirmed": false,
    "content_directory_override": {
      "path": "blog",
      "file_extensions": [".md", ".mdx"]
    }
  }'

Done! Your website is now connected and ready for SEO analysis.

Step 4: Enable Analytics (Optional)

During confirmation, you can opt in to cookie-free analytics by setting analytics_enabled: true. This injects a lightweight tracking script (<1KB) into your site layout, giving you pageview data directly in your dashboard.

curl -X POST https://api.contentglowz.com/api/projects/proj_abc123/confirm \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "project_id": "proj_abc123",
    "confirmed": true,
    "analytics_enabled": true
  }'

What you get with analytics enabled:

  • Pageviews, top pages, referrers, and daily trends per project
  • SEO performance insights used by the AI agents for smarter recommendations
  • Content gap analysis informed by real visitor data

Privacy guarantees:

  • Cookie-free — no consent banner required
  • Under 1KB — no impact on Core Web Vitals
  • EU-hosted — GDPR/CCPA compliant by design
  • No IP storage — country derived from CDN headers, then discarded

You can enable or disable analytics at any time via the project update endpoint:

curl -X PATCH https://api.contentglowz.com/api/projects/proj_abc123 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{"analytics_enabled": false}'

View your analytics in the dashboard or via the API:

curl https://api.contentglowz.com/api/analytics/summary?projectId=proj_abc123 \
  -H "Authorization: Bearer YOUR_API_KEY"

📦 What Gets Detected

Frameworks

FrameworkHow It’s DetectedConfidence
Astroastro.config.mjs, astro.config.js, or astro.config.ts95%
Next.jsnext.config.js, next.config.mjs, or next.config.ts95%
Gatsbygatsby-config.js or gatsby-config.ts95%
Nuxtnuxt.config.js or nuxt.config.ts95%
Hugohugo.toml, hugo.yaml, or config.toml with content/ dir70-95%
Jekyll_config.yml90%

If no config file is found, the platform checks package.json dependencies (85% confidence).

Package Managers

ManagerDetection File
pnpmpnpm-lock.yaml
yarnyarn.lock
npmpackage-lock.json
piprequirements.txt or Pipfile.lock

Content Directories

The platform looks for content in framework-specific locations:

FrameworkDirectories Checked (in order)
Astrosrc/content/, src/pages/, content/
Next.jscontent/, posts/, pages/, app/
Gatsbycontent/, src/pages/, blog/
Nuxtcontent/, pages/
Hugocontent/
Jekyll_posts/, _pages/, docs/

Fallback directories: blog/, posts/, articles/, docs/


🔄 Onboarding Workflow

┌──────────────────────────────────────────────────────────────┐
│                    ONBOARDING FLOW                           │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  POST /api/projects/onboard                                  │
│  ├─→ Creates project record                                  │
│  └─→ Status: CLONING                                         │
│                                                              │
│  POST /api/projects/{id}/analyze                             │
│  ├─→ Clones your GitHub repository                          │
│  ├─→ Detects framework (Astro, Next.js, etc.)               │
│  ├─→ Detects package manager (pnpm, yarn, npm)              │
│  ├─→ Finds content directories                               │
│  ├─→ Counts content files (.md, .mdx)                       │
│  └─→ Status: AWAITING_CONFIRMATION                          │
│                                                              │
│  POST /api/projects/{id}/confirm                             │
│  ├─→ Accept auto-detected settings, OR                       │
│  ├─→ Override with your preferences                          │
│  └─→ Status: COMPLETED ✅                                    │
│                                                              │
│  Ready for SEO analysis!                                     │
│                                                              │
└──────────────────────────────────────────────────────────────┘

Status Values

StatusDescription
pendingProject created, waiting to start
cloningRepository being cloned
analyzingDetecting framework and content
awaiting_confirmationDetection complete, waiting for you
completedReady to use
failedError occurred (check message)

🎛️ Configuration Options

Content Directory Override

If auto-detection picks the wrong directory:

{
  "content_directory_override": {
    "path": "articles",
    "auto_detected": false,
    "file_extensions": [".md", ".mdx", ".astro"]
  }
}

SEO Config Overrides

Customize SEO validation rules:

{
  "config_overrides": {
    "seo_config": {
      "min_word_count": 1500,
      "max_title_length": 60,
      "require_meta_description": true
    }
  }
}

Linking Config Overrides

Customize internal linking rules:

{
  "config_overrides": {
    "linking_config": {
      "min_internal_links": 3,
      "max_external_links": 10,
      "require_pillar_links": true
    }
  }
}

📋 API Reference

Start Onboarding

POST /api/projects/onboard

Request Body:

{
  "github_url": "https://github.com/user/repo",
  "name": "My Website",           // Optional, defaults to repo name
  "description": "Marketing site" // Optional
}

Response:

{
  "project_id": "proj_abc123",
  "status": "cloning",
  "message": "Project created"
}

Analyze Project

POST /api/projects/{project_id}/analyze

Query Parameters:

  • force_reclone (boolean) - Force fresh clone, default: false

Response:

{
  "project_id": "proj_abc123",
  "tech_stack": {
    "framework": "astro",
    "framework_version": "5.0.0",
    "package_manager": "pnpm",
    "confidence": 0.95
  },
  "content_directories": ["src/content", "src/pages"],
  "suggested_content_dir": "src/content",
  "total_content_files": 47,
  "framework_config_found": true
}

Confirm Settings

POST /api/projects/{project_id}/confirm

Request Body:

{
  "project_id": "proj_abc123",
  "confirmed": true,
  "content_directory_override": null,  // Optional
  "config_overrides": null             // Optional
}

List Projects

GET /api/projects

Response:

{
  "projects": [...],
  "total": 3,
  "default_project_id": "proj_abc123"
}

Get Project

GET /api/projects/{project_id}

Update Project

PATCH /api/projects/{project_id}

Request Body:

{
  "name": "New Name",
  "description": "New description",
  "content_directory": {...},
  "config_overrides": {...}
}

Delete Project

DELETE /api/projects/{project_id}

Set Default Project

POST /api/projects/{project_id}/set-default

Refresh Analysis

Re-analyze after repository changes:

POST /api/projects/{project_id}/refresh

🔌 Code Examples

Python

import httpx

API_BASE = "https://api.contentglowz.com"
API_KEY = "your_api_key"

headers = {"Authorization": f"Bearer {API_KEY}"}

# 1. Start onboarding
response = httpx.post(
    f"{API_BASE}/api/projects/onboard",
    json={"github_url": "https://github.com/you/your-site"},
    headers=headers
)
project_id = response.json()["project_id"]
print(f"Project ID: {project_id}")

# 2. Analyze
response = httpx.post(
    f"{API_BASE}/api/projects/{project_id}/analyze",
    headers=headers
)
detection = response.json()
print(f"Framework: {detection['tech_stack']['framework']}")
print(f"Content dir: {detection['suggested_content_dir']}")

# 3. Confirm
response = httpx.post(
    f"{API_BASE}/api/projects/{project_id}/confirm",
    json={"project_id": project_id, "confirmed": True},
    headers=headers
)
print("Project connected!")

JavaScript/TypeScript

const API_BASE = "https://api.contentglowz.com";
const API_KEY = "your_api_key";

async function connectWebsite(githubUrl: string) {
  // 1. Start onboarding
  const onboardRes = await fetch(`${API_BASE}/api/projects/onboard`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": `Bearer ${API_KEY}`
    },
    body: JSON.stringify({ github_url: githubUrl })
  });
  const { project_id } = await onboardRes.json();

  // 2. Analyze
  const analyzeRes = await fetch(
    `${API_BASE}/api/projects/${project_id}/analyze`,
    {
      method: "POST",
      headers: { "Authorization": `Bearer ${API_KEY}` }
    }
  );
  const detection = await analyzeRes.json();
  console.log(`Framework: ${detection.tech_stack.framework}`);

  // 3. Confirm
  await fetch(`${API_BASE}/api/projects/${project_id}/confirm`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": `Bearer ${API_KEY}`
    },
    body: JSON.stringify({ project_id, confirmed: true })
  });

  return project_id;
}

cURL Script

#!/bin/bash
# connect-website.sh

API_BASE="https://api.contentglowz.com"
API_KEY="your_api_key"
GITHUB_URL="https://github.com/you/your-site"

# 1. Start onboarding
PROJECT_ID=$(curl -s -X POST "$API_BASE/api/projects/onboard" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d "{\"github_url\": \"$GITHUB_URL\"}" \
  | jq -r '.project_id')

echo "Project ID: $PROJECT_ID"

# 2. Analyze
curl -s -X POST "$API_BASE/api/projects/$PROJECT_ID/analyze" \
  -H "Authorization: Bearer $API_KEY" \
  | jq '.tech_stack'

# 3. Confirm
curl -s -X POST "$API_BASE/api/projects/$PROJECT_ID/confirm" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d "{\"project_id\": \"$PROJECT_ID\", \"confirmed\": true}"

echo "Done! Project connected."

🔄 Keeping Your Project Updated

Refresh After Changes

When your repository changes (new content, structure updates):

curl -X POST https://api.contentglowz.com/api/projects/proj_abc123/refresh \
  -H "Authorization: Bearer YOUR_API_KEY"

This will:

  • Pull latest changes from GitHub
  • Re-detect framework (catches version updates)
  • Update content file counts
  • Preserve your custom config overrides

CI/CD Integration

Add to your deployment workflow:

# .github/workflows/deploy.yml
- name: Refresh SEO Analysis
  run: |
    curl -X POST https://api.contentglowz.com/api/projects/$PROJECT_ID/refresh \
      -H "Authorization: Bearer ${{ secrets.SEO_API_KEY }}"

❓ Troubleshooting

”Project not found”

  • Verify the project ID is correct
  • Check if the project was created successfully

Analysis fails

  • Ensure your GitHub repository is public (or you’ve granted access)
  • Verify the repository URL is correct
  • Check if the repository exists

Wrong framework detected

Detection priority:

  1. Config file (astro.config.mjs, next.config.js, etc.)
  2. package.json dependencies
  3. Directory structure hints

Override manually in the confirm step if needed.

No content directory found

  • Use content_directory_override to specify manually
  • Check your content is in markdown files (.md, .mdx)
  • Verify the directory exists in your repository

Low confidence score

Confidence below 70% means:

  • No framework config file found
  • Detection based on package.json or directory structure
  • Consider adding a config file or overriding manually

🎯 Next Steps

Now that your website is connected:

  1. Run SEO Analysis - Get your topical authority score
  2. View Recommendations - See prioritized improvements
  3. Set Up Monitoring - Get alerts on changes

Need help? Contact support@contentglowz.com or join our Discord.