All Guides

Visual Brand Analysis

Capture a competitor's website screenshot, run it through the brand_scorecard template, and compare scores side-by-side. A complete end-to-end analysis workflow.

~10 min

Overview

The POST /api/v1/analyze endpoint accepts an image URL and an analysis template, then returns a structured brand score with dimension breakdowns. This guide uses the built-in brand_scorecard template to score a competitor's homepage.

What you'll build

1

Provide screenshot URL

A publicly accessible image of the page to analyse

2

Run brand_scorecard

AI scores the image across 5 brand dimensions

3

Compare results

Run the same template on your brand and diff the scores

The /api/v1/analyze endpoint has a daily quota of 500 analyses per workspace. Rate limit: 20 requests per minute. See the API reference for full details.


Run Analysis

POST an image URL and the template name to the analyze endpoint. The image must be publicly accessible — use a direct link to a screenshot hosted on S3, Cloudflare Images, or any CDN.

1

Analyse a competitor's homepage

curl -X POST https://www.linksii.com/api/v1/analyze \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://cdn.example.com/screenshots/competitor-homepage.png",
    "template": "brand_scorecard",
    "workspace_id": "ws_01HXYZ",
    "context": {
      "brand_name": "Competitor Inc",
      "industry": "SaaS"
    }
  }'

Request body parameters

FieldTypeRequiredDescription
image_urlstringYesPublic HTTPS URL of the image to analyse (PNG, JPEG, WebP)
templatestringYesTemplate name or custom template ID. Use brand_scorecard for brand scoring
workspace_idstringYesWorkspace to bill the analysis against
contextobjectNoOptional metadata passed to the template prompt (brand_name, industry, etc.)

Understand the Response

The brand_scorecard template returns an overall score (0–100) plus scores across five brand dimensions with explanations.

{
  "data": {
    "id": "analysis_01HPQR",
    "workspace_id": "ws_01HXYZ",
    "template": "brand_scorecard",
    "score": 74,
    "dimensions": {
      "visual_identity": {
        "score": 82,
        "summary": "Strong logo placement and consistent colour palette. Hero image reinforces the brand message."
      },
      "messaging_clarity": {
        "score": 71,
        "summary": "Value proposition is clear but the subheading is dense. Consider shorter copy above the fold."
      },
      "trust_signals": {
        "score": 68,
        "summary": "Logos present but no visible review counts. Adding social proof numbers would improve trust."
      },
      "cta_effectiveness": {
        "score": 79,
        "summary": "Primary CTA is prominent and action-oriented. Secondary CTA competes slightly with primary."
      },
      "ai_discoverability": {
        "score": 70,
        "summary": "Brand name appears in meta context but lacks structured data signals for AI indexing."
      }
    },
    "recommendations": [
      "Add aggregate review count near the hero CTA",
      "Shorten the subheading to under 12 words",
      "Include FAQ schema markup to improve AI discoverability"
    ],
    "image_url": "https://cdn.example.com/screenshots/competitor-homepage.png",
    "created_at": "2025-06-01T10:05:00Z"
  }
}

Accessing dimension scores

# Extract all dimension scores with jq
curl -X POST https://www.linksii.com/api/v1/analyze \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"image_url":"https://cdn.example.com/screenshots/competitor.png","template":"brand_scorecard","workspace_id":"ws_01HXYZ"}' \
  | jq '.data.dimensions | to_entries[] | "\(.key): \(.value.score)"'

Compare Scores

Run the same template on multiple brands and compute the delta. The snippet below analyses two brands in parallel and prints a side-by-side comparison.

# Run both analyses (in separate terminals or background jobs)
curl -X POST https://www.linksii.com/api/v1/analyze \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"image_url":"https://cdn.example.com/my-brand.png","template":"brand_scorecard","workspace_id":"ws_01HXYZ","context":{"brand_name":"My Brand"}}' \
  > my_brand.json

curl -X POST https://www.linksii.com/api/v1/analyze \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"image_url":"https://cdn.example.com/competitor.png","template":"brand_scorecard","workspace_id":"ws_01HXYZ","context":{"brand_name":"Competitor Inc"}}' \
  > competitor.json

# Compare overall scores
echo "My Brand: $(jq '.data.score' my_brand.json)"
echo "Competitor: $(jq '.data.score' competitor.json)"

Save each analysis id to retrieve or compare results later without re-running the analysis. Analysis IDs persist indefinitely.


Error Handling

Common errors for this endpoint

CodeCause & Fix
400image_url is not publicly accessible or is not a valid image. Ensure the URL returns an image Content-Type and is reachable without auth.
400Unknown template name. Check the templates list at GET /api/v1/templates for valid template IDs.
429Daily analysis quota exceeded (500/day). Quota resets at midnight UTC. Use the X-RateLimit-Reset header to know when.
413Image too large. Maximum supported image size is 20 MB.

Handling quota errors

# Check remaining quota from response headers
curl -I -X POST https://www.linksii.com/api/v1/analyze \
  -H "Authorization: Bearer lnk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{...}' \
  | grep -i "x-ratelimit"

Next Steps