Overview
All API endpoints are prefixed with /api/v1. Responses are always JSON. The API is available exclusively to Enterprise plan subscribers.
New to the API? Browse the quickstart guides for end-to-end tutorials with curl, JavaScript, and Python examples.
Quick start
curl https://www.linksii.com/api/v1/workspaces \ -H "Authorization: Bearer lnk_your_api_key_here"
Authentication
Every request must include your API key as a Bearer token in the Authorization header. API keys start with lnk_ and are shown only once at creation time — store them securely.
Header format
Authorization: Bearer lnk_a1b2c3d4e5f6...
Generating keys
Keys are managed from Settings → API Keys or via the POST /api/v1/keys endpoint. Each workspace supports up to 10 active keys.
API access requires an active Enterprise subscription. Requests from Starter or Pro accounts will receive 403 Forbidden.
Rate Limits
Rate limits are enforced per API key. Every response includes headers showing your current usage.
Response headers
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 94 X-RateLimit-Reset: 1710000060
Per-endpoint limits
| Endpoint | Limit | Window |
|---|---|---|
| /api/v1/analyze | 20 req | per minute |
| /api/v1/analyze/report | 10 req | per minute |
| /api/v1/analyze/deliver | 10 req | per minute |
| /api/v1/webhooks | 10 req | per minute |
| /api/v1/templates (writes) | 20 req | per minute |
| /api/v1/templates (reads) | 100 req | per minute |
| All other endpoints | 100 req | per minute |
Exceeding a limit returns 429 Too Many Requests with a Retry-After header. The /api/v1/analyze endpoint also enforces a daily quota of 500 analyses per key (resets at midnight UTC).
Errors & Pagination
Error format
All errors return a JSON body with an error string. Some errors include a machine-readable code.
{
"error": "workspace_id is required",
"code": "MISSING_PARAM" // optional
}HTTP status codes
| Status | Meaning |
|---|---|
| 200 | Success |
| 201 | Resource created |
| 400 | Bad request — invalid input or missing required field |
| 401 | Unauthorized — missing or invalid API key |
| 403 | Forbidden — Enterprise plan required or subscription inactive |
| 404 | Not found — workspace not found or access denied |
| 409 | Conflict — e.g. slug already exists |
| 422 | Unprocessable — e.g. image URL unreachable |
| 429 | Too many requests — rate limit or daily quota exceeded |
| 500 | Server error |
Pagination
List endpoints accept limit (1–100, default 20) and offset (default 0) query parameters. Responses include a meta object:
{
"data": [...],
"meta": {
"total": 143,
"limit": 20,
"offset": 0
}
}Workspaces
Workspaces represent the brands you are tracking. All other resources (prompts, competitors, tracking results) belong to a workspace.
/api/v1/workspacesList all workspaces accessible to the authenticated API key (owned or accepted member).
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | No | Results per page. Range: 1–100. Default: 50. |
| offset | integer | No | Pagination offset. Default: 0. |
Example
curl "https://www.linksii.com/api/v1/workspaces?limit=10" \ -H "Authorization: Bearer lnk_your_key"
Response
{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"brand_name": "Acme Corp",
"domain": "acme.com",
"description": "B2B SaaS for project management",
"created_at": "2024-01-15T10:00:00Z",
"updated_at": "2024-03-01T08:30:00Z"
}
],
"meta": { "total": 3, "limit": 10, "offset": 0 }
}/api/v1/workspacesCreate a new workspace. Useful for spinning up temp workspaces for prospect audits. Respects your plan's workspace limit.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| brand_name | string | Yes | The brand name. |
| domain | string | No | Brand domain, e.g. example.com. |
| description | string | No | Short description used by prompt/competitor suggestion. |
| location | string | No | Geographic location, e.g. 'Belfast, UK'. |
| country | string | No | ISO 3166-1 alpha-2 country code. |
Response (201)
{
"data": {
"id": "uuid",
"brand_name": "Example Clinic",
"domain": "exampleclinic.com",
"description": "...",
"location": "Belfast, UK",
"country": "GB",
"created_at": "2026-04-21T09:00:00Z",
"updated_at": "2026-04-21T09:00:00Z"
}
}/api/v1/workspaces/:idSoft-delete a workspace. Only the workspace owner can delete. Returns 204 No Content on success. Useful for cleaning up temporary prospect workspaces.
Tracking
Tracking results capture how your brand appears across AI platforms (Claude, ChatGPT, Gemini, Perplexity) for each prompt you monitor.
/api/v1/trackingFetch tracking results for a workspace with optional filtering by platform, date range, and pagination.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to fetch results for. |
| platform | string | No | Filter by AI platform. One of: claude, chatgpt, gemini, perplexity. |
| days | integer | No | Lookback window in days. Range: 1–365. Default: 7. |
| limit | integer | No | Results per page. Range: 1–100. Default: 20. |
| offset | integer | No | Pagination offset. Default: 0. |
Example
curl "https://www.linksii.com/api/v1/tracking?workspace_id=WORKSPACE_ID&days=7&platform=chatgpt" \ -H "Authorization: Bearer lnk_your_key"
Response
{
"data": [
{
"id": "uuid",
"prompt_id": "uuid",
"workspace_id": "uuid",
"ai_platform": "chatgpt",
"brand_mentioned": true,
"brand_visibility_pct": 85.5,
"brand_position": 2,
"brand_ordinal_position": 2,
"brand_relative_position": 0.18,
"brand_appearance_count": 3,
"sentiment_score": 0.72,
"sentiment_label": "positive",
"mention_type": "direct",
"sources_cited": ["https://techcrunch.com/..."],
"competitor_mentions": ["Salesforce", "HubSpot"],
"country": "US",
"tracked_at": "2024-03-10T06:00:00Z"
}
],
"meta": { "total": 143, "limit": 20, "offset": 0, "days": 7 }
}Prompts
Prompts are the questions your brand is tracked against across AI platforms. Each workspace has its own set of prompts.
/api/v1/promptsList all prompts for a workspace.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to list prompts for. |
| limit | integer | No | Results per page. Range: 1–100. Default: 20. |
| offset | integer | No | Pagination offset. Default: 0. |
Example
curl "https://www.linksii.com/api/v1/prompts?workspace_id=WORKSPACE_ID" \ -H "Authorization: Bearer lnk_your_key"
Response
{
"data": [
{
"id": "uuid",
"workspace_id": "uuid",
"prompt_text": "What is the best CRM for small businesses?",
"category": "consideration",
"tags": ["crm", "smb"],
"is_active": true,
"created_at": "2024-01-20T09:00:00Z"
}
],
"meta": { "total": 12, "limit": 20, "offset": 0 }
}/api/v1/promptsCreate a new tracking prompt for a workspace.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to add the prompt to. |
| prompt_text | string | Yes | The prompt text. 1–1000 characters. |
| category | string | No | Funnel stage. One of: awareness, consideration, decision, general. Default: general. |
| tags | string[] | No | Optional array of tag strings. |
Example
curl -X POST https://www.linksii.com/api/v1/prompts \
-H "Authorization: Bearer lnk_your_key" \
-H "Content-Type: application/json" \
-d '{
"workspace_id": "WORKSPACE_ID",
"prompt_text": "Which project management tools do remote teams prefer?",
"category": "awareness",
"tags": ["project-management", "remote"]
}'Competitors
Competitors are brands whose AI visibility you want to compare against. They are tracked automatically alongside your brand during each tracking run.
/api/v1/competitorsList competitors for a workspace.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to list competitors for. |
| limit | integer | No | Results per page. Range: 1–100. Default: 50. |
| offset | integer | No | Pagination offset. Default: 0. |
Example
curl "https://www.linksii.com/api/v1/competitors?workspace_id=WORKSPACE_ID" \ -H "Authorization: Bearer lnk_your_key"
Response
{
"data": [
{
"id": "uuid",
"workspace_id": "uuid",
"name": "Salesforce",
"domain": "salesforce.com",
"logo_url": "https://...",
"created_at": "2024-01-22T11:00:00Z"
}
],
"meta": { "total": 4, "limit": 50, "offset": 0 }
}/api/v1/competitorsAdd a competitor to a workspace.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to add the competitor to. |
| name | string | Yes | Competitor brand name. |
| domain | string | No | Competitor domain, e.g. salesforce.com. |
Templates
Analysis templates define the AI system prompt used when running visual analysis (see ). Linksii ships with built-in templates; you can create custom ones too.
/api/v1/templatesList built-in templates and your custom templates. Pass workspace_id to also include workspace-scoped templates.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | No | Optional. Include workspace-scoped templates for this workspace. |
Response
{
"templates": [
{
"id": "uuid",
"slug": "general",
"name": "General Brand Analysis",
"system_prompt": "Analyse the brand presence in this image...",
"output_schema": { ... },
"is_builtin": true,
"workspace_id": null,
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}
]
}/api/v1/templatesCreate a custom analysis template. Slugs must be unique within your user + workspace scope.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Human-readable template name. |
| slug | string | Yes | Lowercase identifier used in the analyze endpoint. Pattern: [a-z0-9_]+ |
| system_prompt | string | Yes | The AI system prompt for this template. |
| output_schema | object | No | Optional JSON schema describing the expected output structure. |
| workspace_id | uuid | No | Optional. Scope the template to a specific workspace. |
Example
curl -X POST https://www.linksii.com/api/v1/templates \
-H "Authorization: Bearer lnk_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Pricing Page Audit",
"slug": "pricing_audit",
"system_prompt": "Analyse this pricing page for clarity, trust signals, and conversion elements..."
}'/api/v1/templates/:idRetrieve a single template by ID.
/api/v1/templates/:idUpdate a custom template. Accepts the same fields as POST (all optional). Built-in templates cannot be modified.
/api/v1/templates/:idDelete a custom template. Built-in templates cannot be deleted. Returns { "success": true }.
API Keys
Manage API keys programmatically. Each workspace supports up to 10 active keys. The full key value is returned only once at creation — only the prefix is stored.
The POST and GET endpoints for /api/v1/keys use session cookie auth (used from the Settings UI), not API key auth. Use the Settings → API Keys page to create and manage keys in the UI.
/api/v1/keysList active API keys for a workspace. Returns prefix only — the full key is never shown again after creation.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to list keys for. |
Response
{
"data": [
{
"id": "uuid",
"key_prefix": "lnk_a1b2",
"name": "Production",
"last_used_at": "2024-03-10T08:00:00Z",
"created_at": "2024-01-15T10:00:00Z",
"revoked_at": null
}
]
}/api/v1/keysCreate a new API key. The full key is returned in the key field and shown only once.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to create the key for. |
| name | string | No | Human-readable label for the key. Default: null. |
Response (201)
{
"data": {
"id": "uuid",
"key": "lnk_a1b2c3d4e5f6...", // shown ONCE — store securely
"key_prefix": "lnk_a1b2",
"name": "Production",
"created_at": "2024-03-12T14:00:00Z",
"workspace_id": "uuid"
}
}/api/v1/keysRevoke an API key by setting its revoked_at timestamp. Revoked keys immediately stop working.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | uuid | Yes | The key ID to revoke. |
Webhooks
Webhooks deliver real-time event notifications to your server. Each workspace supports up to 10 webhooks.
Supported events
Payload format
Linksii signs each delivery with an X-Linksii-Signature header (HMAC-SHA256 of the raw body using the webhook secret). Each request also carries a X-Linksii-Event header.
/api/v1/webhooksList webhooks for a workspace.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to list webhooks for. |
Response
{
"data": [
{
"id": "uuid",
"url": "https://your-server.com/webhooks/linksii",
"events": ["tracking.completed"],
"enabled": true,
"created_at": "2024-03-01T10:00:00Z",
"last_triggered_at": "2024-03-10T06:05:00Z",
"last_status_code": 200
}
]
}/api/v1/webhooksRegister a new webhook. The secret is returned once — use it to verify signature headers on incoming requests.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to attach this webhook to. |
| url | string | Yes | HTTPS endpoint to receive events. Private/internal IPs are blocked. |
| events | string[] | No | Events to subscribe to. Default: ["tracking.completed"]. |
Example
curl -X POST https://www.linksii.com/api/v1/webhooks \
-H "Authorization: Bearer lnk_your_key" \
-H "Content-Type: application/json" \
-d '{
"workspace_id": "WORKSPACE_ID",
"url": "https://your-server.com/webhooks/linksii",
"events": ["tracking.completed"]
}'Response (201)
{
"data": {
"id": "uuid",
"url": "https://your-server.com/webhooks/linksii",
"events": ["tracking.completed"],
"enabled": true,
"created_at": "2024-03-12T14:00:00Z",
"secret": "a1b2c3d4..." // shown ONCE — use to verify X-Linksii-Signature
}
}/api/v1/webhooksDelete a webhook. Pass id and workspace_id as query parameters.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | uuid | Yes | The webhook ID to delete. |
| workspace_id | uuid | Yes | The workspace the webhook belongs to. |
Analyze
The Analyze API runs AI-powered visual analysis on a URL or image, and can generate branded PDF reports or deliver them via email. It uses Claude vision under the hood.
/api/v1/analyzeRun visual analysis on a URL (screenshot captured automatically), image URL, or base64-encoded image. Results are stored and returned immediately.
Rate limit: 20 req/min. Daily quota: 500 analyses per API key (resets midnight UTC). Quota usage is returned in every response.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | No | Web URL to screenshot and analyse. Mutually exclusive with image_url and image_base64. |
| image_url | string | No | Direct URL to an image file. Mutually exclusive with url and image_base64. |
| image_base64 | string | No | Base64-encoded image data. Mutually exclusive with url and image_url. |
| image_media_type | string | No | MIME type when using image_base64. E.g. image/png. Default: image/png. |
| template | string | No | Template slug to use for analysis. Default: general. |
| context | string | No | Optional extra context appended to the system prompt. |
| model | string | No | Claude model override. Default: claude-sonnet-4-6. |
| workspace_id | uuid | No | Optional. Link result to a workspace. |
Example
curl -X POST https://www.linksii.com/api/v1/analyze \
-H "Authorization: Bearer lnk_your_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://yourcompany.com/pricing",
"template": "general",
"workspace_id": "WORKSPACE_ID"
}'Response
{
"success": true,
"analysis_id": "uuid",
"template": "general",
"model": "claude-sonnet-4-6",
"result": { ... }, // template-specific JSON output
"meta": {
"image_source": "https://yourcompany.com/pricing",
"created_at": "2024-03-12T14:00:00Z",
"daily_quota": {
"limit": 500,
"used": 12,
"remaining": 488
}
}
}/api/v1/analyze/reportRun a full brand tracking pipeline across AI platforms and return a branded PDF report (base64) plus raw results. This runs Claude, ChatGPT, Gemini, and Perplexity in parallel.
Rate limit: 10 req/min. This is an expensive pipeline — each call runs 4 AI platforms simultaneously.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| analysis.workspace_id | uuid | Yes | Workspace to run the analysis for. |
| analysis.prompt_text | string | Yes | The brand tracking prompt. Max 1000 characters. |
| analysis.platforms | string[] | No | Platforms to query. Any of: claude, chatgpt, gemini, perplexity. Default: all four. |
| analysis.country | string | No | ISO 3166-1 alpha-2 country code. Default: US. |
| analysis.language | string | No | Language code, e.g. en. Default: en. |
| analysis.brand_name | string | No | Override brand name (defaults to workspace brand_name). |
| branding.company_name | string | No | Displayed on the PDF report. |
| branding.brand_color | string | No | Hex color for report accents. E.g. #2563eb. |
| branding.logo_url | string | No | Logo URL embedded in the report. |
Example
curl -X POST https://www.linksii.com/api/v1/analyze/report \
-H "Authorization: Bearer lnk_your_key" \
-H "Content-Type: application/json" \
-d '{
"analysis": {
"workspace_id": "WORKSPACE_ID",
"prompt_text": "What CRM do fast-growing startups recommend?",
"platforms": ["claude", "chatgpt"],
"country": "US"
},
"branding": {
"company_name": "Acme Corp",
"brand_color": "#2563eb"
}
}'Response
{
"success": true,
"analysis_id": "uuid",
"summary": {
"brand_name": "Acme Corp",
"platforms_analyzed": ["claude", "chatgpt"],
"total_results": 2,
"brand_mentioned_count": 2,
"avg_visibility_pct": 78.5,
"avg_sentiment": 71.2,
"mention_rate_pct": 100,
"brand_score": 74
},
"results": [...], // full tracking results array
"pdf": {
"base64": "JVBERi0xLjQK...",
"content_type": "application/pdf",
"filename": "linksii-analysis-uuid.pdf",
"url": "https://...", // storage URL if configured
"generated_at": "2024-03-12T14:01:30Z"
}
}/api/v1/analyze/deliverSame as /analyze/report but also emails the PDF report to a recipient. Useful for automated white-label reporting workflows.
Additional request fields (vs /report)
| Parameter | Type | Required | Description |
|---|---|---|---|
| delivery.recipient_email | string | Yes | Email address to send the report to. |
| delivery.recipient_name | string | No | Name used in the email greeting. Default: "there". |
Response differences
Same as /report but the top-level pdf key is replaced by a delivery key:
"delivery": {
"recipient_email": "[email protected]",
"email_sent": true,
"pdf_url": "https://...",
"delivered_at": "2024-03-12T14:01:45Z"
}Suggest
Given a domain, generate a curated set of tracking prompts and likely competitors. Powered by Gemini. Designed to turn audit generation into a one-input flow.
/api/v1/suggestScrapes the domain homepage for title and meta description, then uses AI to generate contextual prompts and competitors.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Yes | The brand's domain, e.g. example.com |
| brand_name | string | No | Optional. Derived from the scraped page title if omitted. |
| country | string | No | ISO 3166-1 alpha-2 country code. Affects competitor suggestions. Default: US. |
| prompt_count | integer | No | Number of prompts to return. Range: 5-25. Default: 12. |
| competitor_count | integer | No | Number of competitors to return. Range: 1-10. Default: 5. |
Example
curl -X POST https://www.linksii.com/api/v1/suggest \
-H "Authorization: Bearer lnk_your_key" \
-H "Content-Type: application/json" \
-d '{
"domain": "exampleclinic.com",
"country": "GB",
"prompt_count": 15,
"competitor_count": 5
}'Response
{
"success": true,
"domain": "exampleclinic.com",
"brand_name": "Example Aesthetics",
"description": "Premium aesthetic clinic in London...",
"country": "GB",
"prompts": [
{
"prompt_text": "What are the best aesthetic clinics in London for lip filler?",
"category": "consideration",
"tags": ["aesthetic", "filler", "london"],
"rationale": "High-intent treatment query in primary market"
}
],
"competitors": [
{
"name": "Competitor Clinic",
"domain": "competitorclinic.com",
"rationale": "Geographic and treatment-mix overlap"
}
]
}Rate limit: 30 req/min. No daily quota — this endpoint doesn't run tracking, so it's cheap to call repeatedly.
Audit
The Audit API is the headline pipeline: run many prompts across many platforms, compare against competitors, generate findings with prescriptive recommendations, and return a branded PDF report.
A typical 15-prompt × 4-platform audit runs 60 analyses in parallel and takes 60-120 seconds. Maximum 20 prompts per audit (sync mode). Each audit consumes prompts × platforms credits from your daily analysis quota (500/day).
/api/v1/auditRun a complete audit. Returns aggregated data, findings, recommendations, and (optionally) a branded PDF as base64.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace the audit is scoped to. |
| prompts | string[] | object[] | Yes | Array of prompts. Each can be a plain string or an object with text, category, and tags. Max 20. |
| competitors | object[] | No | Array of { name, domain } competitor objects. Max 10. Omit to supply none, or use auto_competitors. |
| auto_competitors | boolean | No | Default false. If true and no competitors array supplied, the API will auto-suggest 5 competitors using Gemini based on the workspace brand info (pre-audit). |
| auto_discover_competitors | boolean | No | Default false. If true, after tracking completes Gemini extracts the most-mentioned competing brands from the actual AI responses. Non-destructive — surfaces the real AI-recommended competitors in a discovered_competitors response field. Ideal for a 2-pass workflow: run once, see who AI actually mentions, re-run with tuned competitor list. |
| include_raw_results | boolean | No | Default false. If true, echo the raw AI responses in the POST response. Otherwise retrieve later via GET /audit/:id?include_raw=true. |
| platforms | string[] | No | Any of: claude, chatgpt, gemini, perplexity. Default: all four. |
| country | string | No | ISO 3166-1 alpha-2. Default: US. |
| language | string | No | Language code. Default: en. |
| brand_name | string | No | Override. Defaults to the workspace's brand_name. |
| branding | object | No | PDF branding: company_name, brand_color (hex), logo_url, report_title, footer_text, cta_url, cta_text. |
| include_pdf | boolean | No | Default: true. Set to false for JSON-only response. |
Example
curl -X POST https://www.linksii.com/api/v1/audit \
-H "Authorization: Bearer lnk_your_key" \
-H "Content-Type: application/json" \
-d '{
"workspace_id": "WORKSPACE_ID",
"prompts": [
"What are the best aesthetic clinics in London?",
"Who offers the best lip filler treatments in the UK?"
],
"competitors": [
{ "name": "Competitor A", "domain": "competitora.com" }
],
"country": "GB",
"branding": {
"company_name": "Orbyt",
"brand_color": "#00FF6A",
"logo_url": "https://orbythub.com/logo.png",
"report_title": "AI Visibility Audit"
}
}'Response
{
"success": true,
"audit_id": "uuid",
"workspace_id": "uuid",
"summary": {
"brand_name": "Example Aesthetics",
"platforms_analyzed": ["claude", "chatgpt", "gemini", "perplexity"],
"prompts_analyzed": 15,
"total_runs": 60,
"brand_score": 28,
"brand_visibility_pct": 18.3,
"brand_mention_rate_pct": 22.0,
"avg_brand_position": 4.7,
"avg_sentiment": 65.4,
"competitors": [
{
"name": "Competitor A",
"mention_rate_pct": 80.0,
"visibility_pct": 64.2
}
],
"top_sources_cited": [
{ "domain": "reddit.com", "citation_count": 24, "pct_of_total": 18.2 }
],
"platform_breakdown": [...],
"category_breakdown": [...]
},
"findings": [
{
"id": "invisibility_gap",
"severity": "high",
"headline": "Invisible in 78% of buyer queries",
"narrative": "Across 15 prompts and 4 platforms...",
"supporting_data": {...},
"recommendations": [
{
"priority": 1,
"action": "Publish problem-framed content...",
"rationale": "AI platforms favour content that...",
"effort": "medium",
"expected_impact": "high"
}
]
}
],
"discovered_competitors": [
{
"name": "Cathedral Dermatology",
"domain": "cathedraldermatology.com",
"mention_count": 7,
"rationale": "Directly listed as a Belfast dermatology competitor in 7 AI responses"
}
],
"pdf": {
"base64": "JVBERi0xLjQK...",
"url": "https://...",
"content_type": "application/pdf",
"filename": "audit-example-aesthetics-uuid.pdf",
"generated_at": "2026-04-21T14:01:30Z"
},
"meta": {
"started_at": "2026-04-21T14:00:00Z",
"completed_at": "2026-04-21T14:01:30Z",
"duration_seconds": 90,
"daily_quota": { "limit": 500, "used": 60, "remaining": 440 }
}
}/api/v1/audit/:idRetrieve a previously-run audit by ID. Useful for re-downloading the PDF, fetching findings programmatically, or pulling raw tracking data.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| include_pdf | boolean | No | Default false. Set true to include the PDF as base64 in the response. |
| include_raw | boolean | No | Default false. Set true to include raw per-prompt tracking results. |
Example
curl "https://www.linksii.com/api/v1/audit/AUDIT_ID?include_pdf=true" \ -H "Authorization: Bearer lnk_your_key"
Rate limit: 5 req/min on POST (expensive pipeline), 100 req/min on GET. Audits are persisted indefinitely for historical comparison.
Looker Studio
The Looker Studio endpoint powers the Linksii Community Connector for Google Looker Studio. It returns tracking results in a flat, BI-optimised format with support for date ranges, platform filtering, and schema discovery.
/api/v1/looker-studioQuery parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspace_id | uuid | Yes | The workspace to fetch data for (omit when schema=1). |
| schema | string | No | Pass "1" or "true" to return the field schema only (no data). Used by the connector at setup time. |
| days | integer | No | Lookback window. Range: 1–365. Default: 90. Overridden by start_date. |
| start_date | ISO date | No | Override lower bound. E.g. 2024-01-01. |
| end_date | ISO date | No | Override upper bound. Default: now. |
| platform | string | No | Filter by AI platform (claude, chatgpt, gemini, perplexity). |
| limit | integer | No | Rows per page. Range: 1–500. Default: 500. |
| offset | integer | No | Pagination offset. Default: 0. |
Schema mode
# Fetch field schema (used by the Looker Studio connector) curl "https://www.linksii.com/api/v1/looker-studio?schema=1" \ -H "Authorization: Bearer lnk_your_key"
Data response
{
"data": [
{
"id": "uuid",
"tracked_at": "2024-03-10T06:00:00Z",
"ai_platform": "chatgpt",
"country": "US",
"sentiment_label": "positive",
"sentiment_score": 0.72,
"brand_mentioned": true,
"brand_visibility_pct": 85.5,
"brand_position": 2,
"brand_ordinal_position": 2,
"brand_relative_position": 0.18,
"brand_appearance_count": 3,
"mention_type": "direct",
"prompt_query": "What CRM do startups recommend?"
}
],
"meta": {
"total": 1450,
"limit": 500,
"offset": 0,
"workspace_id": "uuid",
"brand_name": "Acme Corp",
"date_from": "2023-12-10T00:00:00Z",
"date_to": "2024-03-10T00:00:00Z"
}
}Contact [email protected] to get the Linksii Community Connector ID for Looker Studio and guidance on connecting your dashboard.