Positioning
REST endpoints for Positioning. Base URL https://api.competlab.com; every request needs a CL-API-Key header (see Authentication). Responses wrap in { item } or { items }; errors in { error }.
Get latest positioning data
/v1/projects/{projectId}/positioningGet the latest positioning data for all competitors in a project. Returns homepage messaging, value propositions, CTAs, target audience, and competitive messaging analysis.
Path parameters
| Name | Type | Description |
|---|---|---|
projectId | string | Project ID |
Request
curl "https://api.competlab.com/v1/projects/507f1f77bcf86cd799439011/positioning" \
-H "CL-API-Key: YOUR_COMPETLAB_API_KEY"Response 200 OK
Example
{
"item": {
"lastUpdatedAt": "2026-03-15T10:00:00.000Z",
"summary": {
"competitorsChecked": 6,
"competitorsSuccessful": 5,
"customer": {
"domain": "yoursite.com",
"messagingStrengthScore": 72,
"hasSpecificHeadline": true,
"hasStrongCta": true,
"showsPricing": false,
"hasFreeTrial": true,
"primaryCta": "Start Free Trial",
"mainHeadline": "Ship Projects 10x Faster"
},
"topMessagingCompetitor": {
"domain": "rival.com",
"messagingStrengthScore": 88,
"primaryCta": "Try It Free",
"mainHeadline": "The Future of Work"
},
"ctaComparison": {
"yourCta": "Start Free Trial",
"strongestCompetitorCta": "Get Started — It's Free",
"strongestCompetitorDomain": "rival.com"
},
"pricingComparison": {
"competitorsShowingPrice": 3,
"competitorsWithFreeTrial": 4,
"youShowPrice": false,
"youHaveFreeTrial": true
},
"messagingScoreGap": -16
},
"competitors": [
{
"domain": "competitor.com",
"isOwn": false,
"homepageUrl": "https://competitor.com",
"content": {
"pageTitle": "Acme - The #1 Project Management Tool",
"pageDescription": "Manage projects, track tasks, and collaborate with your team.",
"mainHeadline": "Ship Projects 10x Faster",
"tagline": "The all-in-one platform for modern teams",
"valueProposition": "Streamline your workflow with AI-powered project management",
"primaryCTA": "Start Free Trial",
"secondaryCTA": "Book a Demo",
"keyOfferings": [
"Task Management",
"Time Tracking",
"Team Collaboration"
],
"targetAudience": "Product teams and agencies",
"mainDifferentiator": "AI-powered automation that saves 5 hours per week",
"pricingMentioned": true,
"startingPrice": "$9/month",
"hasFreeTrial": true,
"freeTrialDuration": "14 days"
}
}
]
}
}Errors
| Status | Code | Meaning |
|---|---|---|
| 401 | api_key_missing · api_key_invalid · api_key_revoked · api_key_expired · insufficient_scope | The CL-API-Key is missing, malformed, revoked, expired, or lacks the required scope. |
| 404 | project_not_found | No project matches the id in the path. |
Every error uses the shared { error: { code, message, status } } envelope; code is one of the values listed above.
{
"error": {
"code": "api_key_invalid",
"message": "Invalid API key",
"status": 401
}
}Get positioning run history
/v1/projects/{projectId}/positioning/historyGet paginated history of positioning monitoring runs for a project. Each entry includes run timing and summary statistics with messaging gap analysis.
Path parameters
| Name | Type | Description |
|---|---|---|
projectId | string | Project ID |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
page | number | Page number (1-indexed). Default 1. Min 1. | |
limit | number | Number of items per page. Default 20. Range 1–100. |
Request
curl "https://api.competlab.com/v1/projects/507f1f77bcf86cd799439011/positioning/history?page=1&limit=20" \
-H "CL-API-Key: YOUR_COMPETLAB_API_KEY"Response 200 OK
Example
{
"items": [
{
"runId": "507f1f77bcf86cd799439011",
"completedAt": "2026-03-15T10:00:00.000Z",
"summary": {
"competitorsChecked": 6,
"competitorsSuccessful": 5,
"customer": {
"domain": "yoursite.com",
"messagingStrengthScore": 72,
"hasSpecificHeadline": true,
"hasStrongCta": true,
"showsPricing": false,
"hasFreeTrial": true,
"primaryCta": "Start Free Trial",
"mainHeadline": "Ship Projects 10x Faster"
},
"topMessagingCompetitor": {
"domain": "rival.com",
"messagingStrengthScore": 88,
"primaryCta": "Try It Free",
"mainHeadline": "The Future of Work"
},
"ctaComparison": {
"yourCta": "Start Free Trial",
"strongestCompetitorCta": "Get Started — It's Free",
"strongestCompetitorDomain": "rival.com"
},
"pricingComparison": {
"competitorsShowingPrice": 3,
"competitorsWithFreeTrial": 4,
"youShowPrice": false,
"youHaveFreeTrial": true
},
"messagingScoreGap": -16
}
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 47,
"totalPages": 3,
"hasMore": true
}
}Paginated — pass page and limit query parameters and follow pagination.hasMore to page through the full set.
Errors
| Status | Code | Meaning |
|---|---|---|
| 401 | api_key_missing · api_key_invalid · api_key_revoked · api_key_expired · insufficient_scope | The CL-API-Key is missing, malformed, revoked, expired, or lacks the required scope. |
Every error uses the shared { error: { code, message, status } } envelope; code is one of the values listed above.
{
"error": {
"code": "api_key_invalid",
"message": "Invalid API key",
"status": 401
}
}Get positioning data for a specific run
/v1/projects/{projectId}/positioning/history/{runId}Get full positioning data for a specific historical monitoring run, including per-competitor homepage messaging, value propositions, CTAs, and audience data.
Path parameters
| Name | Type | Description |
|---|---|---|
runId | string | Run ID |
projectId | string | Project ID |
Request
curl "https://api.competlab.com/v1/projects/507f1f77bcf86cd799439011/positioning/history/507f1f77bcf86cd799439012" \
-H "CL-API-Key: YOUR_COMPETLAB_API_KEY"Response 200 OK
Example
{
"item": {
"runId": "507f1f77bcf86cd799439011",
"completedAt": "2026-03-15T10:00:00.000Z",
"summary": {
"competitorsChecked": 6,
"competitorsSuccessful": 5,
"customer": {
"domain": "yoursite.com",
"messagingStrengthScore": 72,
"hasSpecificHeadline": true,
"hasStrongCta": true,
"showsPricing": false,
"hasFreeTrial": true,
"primaryCta": "Start Free Trial",
"mainHeadline": "Ship Projects 10x Faster"
},
"topMessagingCompetitor": {
"domain": "rival.com",
"messagingStrengthScore": 88,
"primaryCta": "Try It Free",
"mainHeadline": "The Future of Work"
},
"ctaComparison": {
"yourCta": "Start Free Trial",
"strongestCompetitorCta": "Get Started — It's Free",
"strongestCompetitorDomain": "rival.com"
},
"pricingComparison": {
"competitorsShowingPrice": 3,
"competitorsWithFreeTrial": 4,
"youShowPrice": false,
"youHaveFreeTrial": true
},
"messagingScoreGap": -16
},
"competitors": [
{
"domain": "competitor.com",
"isOwn": false,
"homepageUrl": "https://competitor.com",
"content": {
"pageTitle": "Acme - The #1 Project Management Tool",
"pageDescription": "Manage projects, track tasks, and collaborate with your team.",
"mainHeadline": "Ship Projects 10x Faster",
"tagline": "The all-in-one platform for modern teams",
"valueProposition": "Streamline your workflow with AI-powered project management",
"primaryCTA": "Start Free Trial",
"secondaryCTA": "Book a Demo",
"keyOfferings": [
"Task Management",
"Time Tracking",
"Team Collaboration"
],
"targetAudience": "Product teams and agencies",
"mainDifferentiator": "AI-powered automation that saves 5 hours per week",
"pricingMentioned": true,
"startingPrice": "$9/month",
"hasFreeTrial": true,
"freeTrialDuration": "14 days"
}
}
]
}
}Errors
| Status | Code | Meaning |
|---|---|---|
| 401 | api_key_missing · api_key_invalid · api_key_revoked · api_key_expired · insufficient_scope | The CL-API-Key is missing, malformed, revoked, expired, or lacks the required scope. |
| 404 | run_not_found | No run matches the id in the path. |
Every error uses the shared { error: { code, message, status } } envelope; code is one of the values listed above.
{
"error": {
"code": "api_key_invalid",
"message": "Invalid API key",
"status": 401
}
}