Positioning

Get positioning data for a specific run

Changed on

Get full positioning data for a specific historical monitoring run, including per-competitor homepage messaging, value propositions, CTAs, and audience data. Fields we could not measure are null, with a sibling availability object giving the reason; never read a null as zero, false or absent, and note that a measured 0 / false / empty list is reported as itself and is a real finding. A run that finished but produced no summary answers 404 run_not_summarized, which is a different fact from run_not_found: the run exists, it just has nothing to report. It used to answer 200 with an all-zero summary invented from the missing one.

get/v1/projects/{projectId}/positioning/history/{runId}

Request

  • Base URL: https://api.competlab.com
  • URL: https://api.competlab.com/v1/projects/{projectId}/positioning/history/{runId}
  • Auth: API key in header CL-API-Key

Path parameters

runIdstring required
Example:507f1f77bcf86cd799439012

Run ID

projectIdstring required
Example:507f1f77bcf86cd799439011

Project ID

Response

Example response

{
  "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,
        "hasFreeTrial": true,
        "primaryCta": "Start Free Trial",
        "mainHeadline": "Ship Projects 10x Faster",
        "messagingAnalysisAvailable": {
          "reason": "homepage_fetch_failed"
        }
      },
      "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,
        "youHaveFreeTrial": true
      },
      "messagingScoreGap": -16
    },
    "competitors": [
      {
        "domain": "competitor.com",
        "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"
        }
      }
    ]
  }
}

Changes

    • warning

      added the new not_found enum value to the / response property for the response status

    • breaking

      the response property /////////// became nullable for the status

    • breaking

      the response property /////////// became nullable for the status

    • breaking

      the response property /////////// became nullable for the status

    • breaking

      the response property /////////// became nullable for the status

    • breaking

      the response property /////////// became nullable for the status

    • breaking

      the response property /////////// became nullable for the status

    • breaking

      the response property ////// became nullable for the status

    • breaking

      the /////////// response's property type changed from object to string for status

    • breaking

      the /////////// response's property type changed from object to number for status

    • breaking

      the /////////// response's property type changed from object to boolean for status

    • breaking

      the /////////// response's property type changed from object to boolean for status

    • warning

      added the new no_data_available enum value to the / response property for the response status

    • warning

      added the new run_not_summarized enum value to the / response property for the response status

    • info

      for the path request parameter projectId, the type was generalized from no type to string