Skip to main content
Every GenRank API mention object includes a competitors field listing the other brands that appeared in the same ChatGPT response as your brand. This co-occurrence data is the foundation for competitive analysis through the API — it tells you which brands share the response space with you, and by extension, which ones are competing for AI visibility on the same prompts you are targeting. Combined with your own visibility scores, competitor co-occurrence data lets you calculate share of voice, identify competitive threats early, and understand how your brand stacks up in AI-generated responses across your full prompt set.

The competitors field

The competitors field is an array of strings inside each mention object. Each string is the name of another brand that appeared in the ChatGPT response that generated this mention.
competitors
array
required
An array of brand name strings representing other brands that co-occurred in the same ChatGPT response as your brand mention. If no other brands appeared in the response, this array will be empty.The brands listed here are detected automatically by GenRank from the response text. They are not limited to brands you have configured as tracked competitors — any brand that appears in the response is captured.Example: ["SEranking", "ChatGPT Tracker"]

Sample response with competitor data

{
  "brand": "GenRank",
  "domain": "genrank.io",
  "geo": "US",
  "query": "best chatgpt brand tracker",
  "mentions": [
    {
      "position": 1,
      "text_snippet": "GenRank is one of the top tools to track brand visibility in ChatGPT.",
      "annotations": [
        {
          "entity": "GenRank",
          "position_start": 0,
          "position_end": 7,
          "type": "brand"
        }
      ],
      "visibility_percent": 72.5,
      "perceived_brand_qualities": [
        "accurate",
        "easy to use",
        "SEO-focused"
      ],
      "competitors": ["SEranking", "ChatGPT Tracker"]
    }
  ],
  "last_checked": "2025-09-26T10:00:00Z"
}
In this example, "SEranking" and "ChatGPT Tracker" both appeared in the same ChatGPT response as GenRank for the prompt "best chatgpt brand tracker". Your brand appeared in position 1 with a visibility score of 72.5 — but the competitors field shows you are not the only brand being recommended.

Use cases

Building competitive dashboards

The competitors array gives you the raw data to build side-by-side competitive views. By aggregating competitor co-occurrence across all responses over time, you can calculate which competitors appear most frequently alongside your brand and which prompts generate the most competitive crowding.
from collections import Counter

def get_competitor_frequency(responses: list) -> dict:
    competitor_counts = Counter()
    
    for response in responses:
        for mention in response.get("mentions", []):
            for competitor in mention.get("competitors", []):
                competitor_counts[competitor] += 1
    
    return dict(competitor_counts.most_common())

# Example output:
# {"SEranking": 34, "ChatGPT Tracker": 19, "BrandWatch AI": 12}
Build a separate time-series view of competitor frequency per prompt. A competitor that barely appeared six months ago but now shows up consistently is gaining AI visibility momentum — early signal that you may need to respond with content or authority-building efforts.

Calculating share of voice

Share of voice measures your brand’s proportion of total brand mentions across all responses. The competitors array — combined with your own mention count — gives you everything you need to calculate this.
function calculateShareOfVoice(responses) {
  const brandCounts = {};

  responses.forEach(response => {
    const brand = response.brand;

    response.mentions.forEach(mention => {
      // Count your brand
      brandCounts[brand] = (brandCounts[brand] || 0) + 1;

      // Count each competitor
      mention.competitors.forEach(competitor => {
        brandCounts[competitor] = (brandCounts[competitor] || 0) + 1;
      });
    });
  });

  const total = Object.values(brandCounts).reduce((sum, n) => sum + n, 0);

  return Object.fromEntries(
    Object.entries(brandCounts).map(([name, count]) => [
      name,
      ((count / total) * 100).toFixed(1) + "%"
    ])
  );
}

Alerting when a competitor gains mentions

Monitoring competitor frequency over time allows you to set thresholds and trigger alerts when a specific competitor’s co-occurrence rate rises above a baseline. This is useful for teams who want automated notifications when the competitive landscape shifts.
def check_competitor_spike(
    current_counts: dict,
    baseline_counts: dict,
    threshold_percent: float = 20.0
) -> list:
    alerts = []
    
    for competitor, current in current_counts.items():
        baseline = baseline_counts.get(competitor, 0)
        
        if baseline > 0:
            change = ((current - baseline) / baseline) * 100
            if change >= threshold_percent:
                alerts.append({
                    "competitor": competitor,
                    "change_percent": round(change, 1),
                    "baseline": baseline,
                    "current": current
                })
    
    return alerts

Identifying prompts where competitors appear but you don’t

Some of your tracked prompts may generate responses that include competitor brands but not yours. These are prompt gaps — high-value opportunities where competitors have AI visibility and you do not.
def find_competitive_gaps(responses: list, your_brand: str) -> list:
    gaps = []
    
    for response in responses:
        has_your_brand = len(response.get("mentions", [])) > 0
        
        if not has_your_brand:
            # Collect any competitors mentioned in this response
            all_competitors = set()
            for mention in response.get("mentions", []):
                all_competitors.update(mention.get("competitors", []))
            
            # Even without your brand, check if competitors appeared elsewhere
            # For gaps analysis, simply filter for empty mentions with competitor context
            gaps.append({
                "query": response["query"],
                "geo": response["geo"],
                "last_checked": response["last_checked"]
            })
    
    return gaps

How competitor data complements brand visibility

Brand visibility data tells you how your own brand performs. Competitor co-occurrence data tells you who else is in the room. Together, they give you a more complete picture of how your category is being represented in AI-generated responses. A high visibility score on a prompt where no competitors appear is a strong signal — you own that response space. A lower score on a prompt crowded with five competitors means you are sharing attention. A prompt where competitors appear but you do not is a gap to close. Use visibility scores and competitor co-occurrence together, not in isolation, when making decisions about which prompts to prioritize for optimization.
The competitors field captures all brands that appeared in the response — not just the competitors you have explicitly configured in your GenRank account. This means you may discover emerging competitors in your category through the API before you are aware of them from other sources.