API Documentation
Integrate the Internal Linking Analyzer into your applications with our RESTful API
Quick Start
- 1.Create an API key in your dashboard
- 2.Include your API key in the
Authorizationheader - 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_hereBase URL
https://yourdomain.com/tools/internal-linking-analyzer/apiAPI Endpoints
Start Analysis
POST/analyze/startInitiates 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=:analysisIdRetrieves 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=100Retrieves 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=:formatExport analysis results in various formats.
Supported Formats:
csv- Comma-separated valuesjson- JSON formatexcel- 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.csvRate 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: