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
Provide screenshot URL
A publicly accessible image of the page to analyse
Run brand_scorecard
AI scores the image across 5 brand dimensions
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.
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
| Field | Type | Required | Description |
|---|---|---|---|
| image_url | string | Yes | Public HTTPS URL of the image to analyse (PNG, JPEG, WebP) |
| template | string | Yes | Template name or custom template ID. Use brand_scorecard for brand scoring |
| workspace_id | string | Yes | Workspace to bill the analysis against |
| context | object | No | Optional 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
| Code | Cause & Fix |
|---|---|
| 400 | image_url is not publicly accessible or is not a valid image. Ensure the URL returns an image Content-Type and is reachable without auth. |
| 400 | Unknown template name. Check the templates list at GET /api/v1/templates for valid template IDs. |
| 429 | Daily analysis quota exceeded (500/day). Quota resets at midnight UTC. Use the X-RateLimit-Reset header to know when. |
| 413 | Image 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
Custom Analysis Templates
Create your own scoring template with a custom prompt to focus on specific brand attributes.
Competitor Monitoring
Track competitor AI visibility scores over time alongside your brand analysis.
Analyze API Reference
Full parameter reference, rate limits, and all supported template names.