API Documentation

Integrate the Internal Linking Analyzer into your applications with our RESTful API

Quick Start

  1. 1.Create an API key in your dashboard
  2. 2.Include your API key in the Authorization header
  3. 3.Make requests to start analyses and retrieve results

Authentication

Core analysis endpoints support Bearer API keys. Dashboard-only endpoints still require an authenticated session cookie.

Authorization: Bearer ila_sk_your_api_key_here

Base URL

https://yourdomain.com/tools/internal-linking-analyzer/api

API Endpoints

Start Analysis

POST
/analyze/start

Initiates a new internal linking analysis for a website.

Request Body:

{
  "config": {
    "baseUrl": "https://example.com",
    "sourceUrls": ["https://example.com/blog/post-a"],
    "targetUrls": ["https://example.com/services/seo"],
    "minWords": 3,
    "suggestionsPerSource": 5,
    "suggestionsPerTarget": 3,
    "similarityThreshold": 0.65
  },
  "workspaceId": "workspace_123" // Optional
}

Response (200 OK):

{
  "analysisId": "analysis_abc123",
  "status": "queued",
  "quota": {
    "used": 1,
    "limit": 3,
    "remaining": 2
  }
}

cURL Example:

curl -X POST https://yourdomain.com/tools/internal-linking-analyzer/api/analyze/start \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "config": {
      "baseUrl": "https://example.com",
      "sourceUrls": ["https://example.com/blog/post-a"],
      "targetUrls": ["https://example.com/services/seo"]
    }
  }'

Get Analysis Status

GET
/analyze/status?id=:analysisId

Retrieves the current status and results of an analysis.

Response (200 OK):

{
  "id": "analysis_abc123",
  "status": "processing",
  "progress": 42,
  "pagesFound": 17,
  "pagesLimit": 40,
  "createdAt": "2026-02-23T10:30:00.000Z",
  "startedAt": "2026-02-23T10:30:10.000Z",
  "completedAt": null
}

cURL Example:

curl -X GET "https://yourdomain.com/tools/internal-linking-analyzer/api/analyze/status?id=analysis_abc123" \
  -H "Authorization: Bearer YOUR_API_KEY"

Get Opportunities

GET
/analyze/opportunities?id=:analysisId&page=1&pageSize=100

Retrieves all internal linking opportunities found in an analysis.

Query Parameters:

  • id - Analysis ID (required)
  • page - Page number (default: 1)
  • pageSize - Results per page (10-500, default: 100)

Response (200 OK):

{
  "analysis": {
    "id": "analysis_abc123",
    "status": "completed"
  },
  "opportunities": [
    {
      "id": "opp_123",
      "sourcePageUrl": "/blog/seo-tips",
      "targetPageUrl": "/services/seo",
      "suggestedAnchorText": "SEO services",
      "alternativeAnchorText": "professional SEO optimization",
      "relevanceScore": 0.95,
      "priority": "high",
      "aiReasoning": "Strong topical relevance..."
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 100,
    "total": 127,
    "totalPages": 3
  }
}

cURL Example:

curl -X GET "https://yourdomain.com/tools/internal-linking-analyzer/api/analyze/opportunities?id=analysis_abc123&page=1&pageSize=100" \
  -H "Authorization: Bearer YOUR_API_KEY"

Export Analysis

GET
/dashboard/tools/internal-linking-analyzer/api/analyses/:id/export?format=:format

Export analysis results in various formats.

Supported Formats:

  • csv - Comma-separated values
  • json - JSON format
  • excel - Excel spreadsheet (.xlsx)
  • pdf - PDF report (Starter plan+)

cURL Example:

curl -X GET "https://yourdomain.com/dashboard/tools/internal-linking-analyzer/api/analyses/analysis_abc123/export?format=csv" \
  -H "Cookie: next-auth.session-token=YOUR_SESSION_COOKIE" \
  -o results.csv

Rate Limits

API rate limits vary by plan:

  • Starter: 30 requests/month
  • Professional: 90 requests/month
  • Business: 200 requests/month
  • Agency: 600 requests/month
  • Enterprise: 1800+ requests/month

Note: Rate limits are enforced server-side. The API currently does not emit dedicated rate-limit headers.

Error Responses

401 Unauthorized

{
  "error": "Unauthorized"
}

403 Forbidden

{
  "error": "Feature not available on your plan",
  "upgradeRequired": true
}

429 Too Many Requests

{
  "error": "Too many requests. Please try again later."
}

Code Examples

JavaScript / Node.js

const fetch = require('node-fetch');

const API_KEY = 'your_api_key_here';
const BASE_URL = 'https://yourdomain.com/tools/internal-linking-analyzer/api';

async function startAnalysis(url) {
  const response = await fetch(`${BASE_URL}/analyze/start`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      config: {
        baseUrl: url,
        sourceUrls: [`${url}/blog/post-a`],
        targetUrls: [`${url}/services/seo`]
      }
    })
  });
  
  const data = await response.json();
  console.log('Analysis started:', data);
  return data.analysisId;
}

async function getResults(analysisId) {
  const response = await fetch(`${BASE_URL}/analyze/opportunities?id=${analysisId}`, {
    headers: {
      'Authorization': `Bearer ${API_KEY}`
    }
  });
  
  const data = await response.json();
  return data.opportunities;
}

// Usage
startAnalysis('https://example.com')
  .then(analysisId => getResults(analysisId))
  .then(opportunities => console.log('Found', opportunities.length, 'opportunities'));

Python

import requests

API_KEY = 'your_api_key_here'
BASE_URL = 'https://yourdomain.com/tools/internal-linking-analyzer/api'

def start_analysis(url):
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    
    payload = {
        'config': {
            'baseUrl': url,
            'sourceUrls': [f'{url}/blog/post-a'],
            'targetUrls': [f'{url}/services/seo']
        }
    }
    
    response = requests.post(f'{BASE_URL}/analyze/start', 
                           headers=headers, 
                           json=payload)
    data = response.json()
    print(f"Analysis started: {data}")
    return data['analysisId']

def get_opportunities(analysis_id):
    headers = {'Authorization': f'Bearer {API_KEY}'}
    
    response = requests.get(f'{BASE_URL}/analyze/opportunities?id={analysis_id}',
                          headers=headers)
    data = response.json()
    return data['opportunities']

# Usage
analysis_id = start_analysis('https://example.com')
opportunities = get_opportunities(analysis_id)
print(f"Found {len(opportunities)} opportunities")

Need Help?

If you have questions or need assistance with the API, we're here to help: