API — LLMPulse
Build dashboards, ETL pipelines and automations with a clean, well-typed API.
LLM Pulse is an AI visibility analytics platform that monitors how your brand appears in AI-generated responses from ChatGPT, Perplexity, Gemini, and other LLMs. The API gives you programmatic access to all your visibility data — including brand mentions, citation sources, sentiment analysis, and share of voice metrics. Use it to build custom dashboards, automate reports, or integrate AI visibility tracking into your existing tools.
Authentication
Use a Bearer token from your API Key.
Authorization: Bearer YOUR_API_KEY
Base URL
Use this base URL for all endpoints below. Examples already include the full path.
https://api.llmpulse.ai/api/v1
Using an AI agent? Read the llms.txt
We serve a machine-readable version of these docs so coding agents (Claude Code, Cursor, ChatGPT, etc.) can find the right endpoint without parsing this page.
/api-docs/llms.txt — short index, generated from the live route table.
/api-docs/llms-full.txt — full reference (every endpoint, every parameter).
100% UI-to-API parity — found a gap? We''ll close it
We aim for 100% UI-to-API parity — anything you can see in the LLM Pulse dashboard should be reachable through the API. If you find a gap, report it and we commit to implementing it, typically within hours to a few days.
Quick start
The logical flow is: list resources → (optionally) fetch dimensions → query metrics. The first call to /dimensions/projects already validates your API key.
- List your projects:
GET /dimensions/projects - (Optional) Fetch project dimensions (competitors, models, locales, tags)
- Request metrics under
/metrics/*
API Playground
API Playground
curl -X GET "https://api.llmpulse.ai/api/v1/ping" -H "Authorization: Bearer YOUR_API_KEY"
Response will appear here...
Sign up to get your API key and start testing
Get API KeyAuthentication
Send your key in the Authorization header as a Bearer token. Rotate/revoke under Settings → API Keys.
Missing or malformed headers return 401 ERR_MISSING_AUTH. Unknown keys return 401 ERR_INVALID_API_KEY. Revoked keys return 403 ERR_REVOKED_API_KEY.
Each call runs in the context of the API key’s user. Projects must belong to that user; otherwise 404 ERR_PROJECT_NOT_FOUND.
Versioning & Rate limits
Current version: v1. Future breaking changes will bump the path (e.g. /api/v2).
Rate limiting: 300 requests per minute per API key. Contact us for higher quotas.
Metrics endpoints support conditional GET (ETag/Last-Modified); see Cache & Conditional GET.
Dimensions endpoints
GET /dimensions/projects
Lists the authenticated user’s projects (also serves as an auth check).
GET /dimensions/competitors
Lists competitors for the project.
GET /dimensions/collections
Lists collections (Tags) belonging to the project.
GET /dimensions/tags
Alias for /dimensions/collections. Returns the same payload, but named as tags for consistency with the UI.
GET /dimensions/models
Lists models present in daily metrics for the project.
GET /dimensions/locales
Lists countries and languages present in daily metrics for the project.
GET /dimensions/sentiments
(Optional) Lists available sentiment buckets and their metric names.
- Params:
project_id(required).
GET /dimensions/prompts
Lists prompts in a project.
- Params:
project_id(required),collection_id,prompt(prompt ID),country_code,language_code,from,to,page,per_page(≤100).
GET /dimensions/prompt_executions
Lists prompt executions in a project.
- Params:
project_id(required),model,collection_id,prompt(prompt ID),country_code,language_code,from,to,page,per_page.
GET /dimensions/sources
Lists non-rejected sources produced by prompt executions.
- Params:
project_id(required),model,collection_id,prompt(prompt ID),country_code,language_code,from,to,page,per_page.
GET /dimensions/mentions
Lists mentions created by your project.
- Params:
project_id(required),collection_id,prompt(prompt ID),from,to,page,per_page.
GET /dimensions/citations
Lists citations created by your project.
- Params:
project_id(required),collection_id,prompt(prompt ID),from,to,page,per_page.
GET /dimensions/competitor_mentions
Lists competitor mentions detected in your executions.
- Params:
project_id(required),competitors(CSV ids),prompt(prompt ID),from,to,page,per_page.
GET /dimensions/competitor_citations
Lists competitor citations detected in your executions.
- Params:
project_id(required),competitors(CSV ids),prompt(prompt ID),from,to,page,per_page.
GET /dimensions/all_mentions
Unified endpoint combining brand and competitor mentions. Each record includes an actor_type field (project or competitor).
- Params:
project_id(required),competitors(CSV ids),model,collection_id,prompt(prompt ID),country_code,language_code,from,to,page,per_page.
GET /dimensions/all_citations
Unified endpoint combining brand and competitor citations. Each record includes an actor_type field (project or competitor).
- Params:
project_id(required),competitors(CSV ids),model,collection_id,prompt(prompt ID),country_code,language_code,from,to,page,per_page.
GET /dimensions/projects/:id
Get detailed information about a project including matching names, industry, business model, and statistics.
GET /dimensions/competitors/:id
Get detailed information about a competitor including matching names and app store IDs.
Agent Analytics
Surfaces AI bot crawler traffic hitting your origin server (GPTBot, PerplexityBot, ClaudeBot, OAI-SearchBot, Google-Extended, and ~25 other AI bots) from Cloudflare or CSV uploads. Available on Scale and above.
GET /metrics/agent_traffic
Aggregated AI bot traffic for a project, grouped by bot or by company, with daily/weekly/monthly granularity.
- Params:
project_id(required),range,from,to,bot,company,group_by(bot|company),granularity(day|week|month).
GET /dimensions/agent_bots
Static catalog of AI bots that Agent Analytics can identify. Use it to render filter UIs that mirror our internal classification (slug, display name, company, category, Cloudflare verified-bot mapping).
- Params:
project_id(required).
Citation Intelligence
Cited-page intelligence — grouped URL/domain/host views, page-cache metadata, mention evidence inside cited pages, occurrence lists, and sanitized cached content.
GET /citation_intelligence/groups
Grouped citation intelligence by url, domain, or host with per-model breakdown, citation rate, and average citation position (ignores position = 0 rows).
- Params:
project_id(required),view(url|domain|host),page,per_page,order(group_key,total_responses,total_citations,citation_rate,avg_citation_position,first_seen_at,last_seen_at),direction,model,collection_id,country_code,language_code,prompt,from,to,query,source_type(owned|competitor|third_party|social_media|own_domain|ugc|background),sentiment(negative),content_gap(mentioned|gap). Invalid enum values returnERR_INVALID_PARAM.
GET /citation_intelligence/urls/:url_sha256
URL-level detail for one cited page — totals, citation rate, avg citation position, source-type counts, per-model counts, distinct URL variants, page-cache metadata, and page mention evidence with snippets and actor labels.
- Params:
project_id(required),:url_sha256(64 hex chars in URL), same optional filters as/citation_intelligence/groups.ERR_NOT_FOUNDonly when the URL was never cited by the project; filters that empty the result still return200with zero stats.
GET /citation_intelligence/urls/:url_sha256/occurrences
Paginated occurrences of a cited URL across prompt executions, with response excerpt, prompt text, model, executed_at, citation_position and source_type per row.
- Params:
project_id(required),:url_sha256(64 hex chars),page,per_page, same optional filters as/citation_intelligence/groups.
GET /citation_intelligence/urls/:url_sha256/content
Sanitized cached page content for a cited URL — page-cache metadata, mention evidence and snippets, full plain text, and rendered HTML (scripts and unsafe markup removed).
- Params:
project_id(required),:url_sha256(64 hex chars).
AI Model Insights
Aggregate parts of the in-app AI Model Insights report. All three endpoints filter by executed_at (not created_at) and share a standard actor shape: { type, id, competitor_id, name, domain } with bare (scheme-less) domains.
GET /reports/ai_model_insights/summary
Per-model mention counts and shares, citation counts and shares, brand net sentiment with raw positive/negative counts, weighted visibility totals and shares, plus actor matrices for each.
- Params:
project_id(required),range(default 28),from,to,granularity(day|week|month),collection_id,country_code,language_code,competitors(CSV of competitor IDs; unknown IDs →ERR_INVALID_PARAM).
GET /reports/ai_model_insights/position_distribution
Position-distribution comparison used in the AI Model Insights report — one or two brand series with bucketed totals (Position 1, Position 2-3, Position 4-7, Position 8+) and chart-ready time series per bucket.
- Params:
project_id(required),range,from,to,granularity,collection_id,country_code,language_code,model(restrict to one model),brand1,brand2(competitor IDs for the comparison brands; omitbrand1to compare the project brand).
GET /reports/ai_model_insights/ai_overview_results
Aggregate Google AI Overview result-availability data — total AI Overview responses, responses with results (<code>no_result = false</code>), result rate, chart-ready trend data, and a paginated by-prompt result-rate table.
- Params:
project_id(required),range,from,to(filters byexecuted_at),collection_id,country_code,language_code,granularity,page,per_page.
Recommendations
Read-only API for the same recommendation runs that power the in-app Recommendations experience.
GET /recommendations
Lists recommendation runs for a project with type/status filters.
- Params:
project_id(required),recommendation_type(ai_visibility|social_community|brand_building|sentiment_reputation),status(pending|processing|completed|failed),page,per_page. Invalid enum values returnERR_INVALID_PARAM.
GET /recommendations/:id
One recommendation run with its items and report data — items array with title, priority, action steps, metadata, source references, plus item counts grouped by <code>active</code>, <code>completed</code>, <code>archived</code>.
- Params:
project_id(required),:id(in URL),item_status(active|completed|archived),resolve_source_refs(defaulttrue).
Answers (AI Responses)
Access the actual AI-generated responses with full content, mentions, citations, and sentiment analysis.
GET /answers
List AI responses with their content. Returns paginated results with truncated response text (max 10,000 chars).
- Params:
project_id(required),model,collection_id,prompt(prompt ID),country_code,language_code,from,to,page,per_page.
GET /answers/:id
Get a single AI response with full details including mentions, citations, sentiments, and sources.
- Params:
project_id(required),id(answer ID in URL).
Detailed Sentiments
Access detailed sentiment analysis with comments, topics, and scores. This is different from /dimensions/sentiments which only returns sentiment categories.
GET /sentiments
List detailed sentiment records with full analysis context.
- Params:
project_id(required),model,competitor_id,brand_only,analysis(very_positive/positive/neutral/negative/very_negative),collection_id,prompt(prompt ID),country_code,language_code,from,to,page,per_page.
Prompts (Bulk Create)
Add prompts to a project in bulk via the API. Validates against account prompt limits and deduplicates automatically.
POST /prompts
Create up to 100 prompts per request. Existing prompts (same text + locale) are skipped.
- Body (JSON):
project_id(required),prompts(array, required, max 100),country_code(required),language_code(required).
Content Intelligence
Create and manage AI-powered content intelligence tasks via the API. Tasks are processed asynchronously and results can be polled.
POST /intelligence_tasks
Create a content intelligence task. Two modes: prompt-based (provide prompt_id) or agentic (provide custom_topic and/or user_instructions).
- Body (JSON):
project_id(required),task_type(required: brief, create, update, pr_insights, custom),prompt_id,custom_topic,user_instructions,output_language_code,existing_content,existing_content_url.
GET /intelligence_tasks
List content intelligence tasks for a project with optional filtering.
- Params:
project_id(required),task_type,status,page,per_page.
GET /intelligence_tasks/:id
Get full task details including result data when completed. Accepts numeric ID or public_id.
- Params:
project_id(required),:id(task ID or public_id in URL).
Agent Write Endpoints
These endpoints accept POST/PATCH/PUT/DELETE and require an API key with the read_write scope. A token with the read scope receives 403 ERR_INSUFFICIENT_SCOPE. Writes share a tighter rate limit (60/min/key) in addition to the global 300/min/key budget.
POST /competitors
Add a competitor (brand_name + domain) to a project. Honours the per-plan max competitors cap.
- Body (JSON):
project_id(required),brand_name(required),domain(required, URL is normalised),matching_names(optional array).
POST /collections
Create a tag (Collection) in a project. Optionally attach existing prompts in the same call. Tag name is case-insensitive unique per project.
- Body (JSON):
project_id(required),name(required),description(optional),prompt_ids(optional array — must belong to the project).
POST /prompts/assign_tags
Idempotent bulk attachment of tags to existing prompts. Tags can be resolved by id or name.
- Body (JSON):
project_id(required),prompt_ids(required array),tag_ids(one-of),tag_names(one-of),create_missing(optional bool — auto-create unknown tag names).
POST /annotations
Mark a date in the project timeseries with a title + description. Requires the Growth plan or above (returns ERR_PLAN_REQUIRED otherwise).
- Body (JSON):
project_id(required),title(required),annotation_date(optional ISO YYYY-MM-DD; default today),description(optional),color(optional hex),annotation_category_id(optional — must belong to the project).
POST /technical_geo_reports
Launch the full technical GEO analysis bundle (crawlability, schema, content readiness, discoverability, site structure, robots.txt, llms.txt, AI visibility) for a URL + country. Each report runs as a background job.
- Body (JSON):
project_id(required),url(required),country_code(optional — defaults to the project country).
Filters & Common params
project_idrequired for all project-scoped endpoints.metricsormetric: CSV ofmentions, citations, responses, mention_rate (or visibility), citation_rate, ai_visibility_score, avg_position, avg_mention_position, sentiment_very_positive, sentiment_positive, sentiment_neutral, sentiment_negative, sentiment_very_negative, net_sentimentgranularity:day|week|month(weeks start Monday)- Time window: either
range(days) orfrom&to(ISO8601). If you sendto,fromis required. Defaults withfrom/to: missingfrom= 30 days ago (start of day); missingto= now (end of day). - Filters:
model,collection_id(tag id),prompt(prompt ID),country_code,language_code,competitors(CSV IDs) include_project(defaulttrue) — setfalseto exclude your project (return only competitors).
Metrics — Semantics & aggregation
These semantics are aligned 1:1 with the Overview UI.
- mentions: daily sums of
mentions_count. Forweek/monthwe compute the PERIOD TOTAL (Mon–Sun for weeks) and repeat that same total for every day in the period. If a period’s total is 0, we “carry” the last non-zero period total (sticky). - citations: same behavior as mentions (PERIOD TOTAL repeated daily with sticky carry when the period total is 0).
- responses: total number of prompt executions (API calls to LLMs). Uses project-level execution count regardless of actor. •
day: daily sum. •week/month: period total (no sticky carry — days with 0 executions show 0). - Mention Rate
mention_rate(also accepted asvisibility): percentage per actor, using the project-level executions as denominator under the same filters (mentions_count/prompt_executions_count× 100). •day: compute the daily ratio. •week/month: compute the ratio-of-sums for the period (Σ mentions / Σ executions) and repeat that value for every day in the period. If the period's denominator is 0, carry forward the last non-null value. - citation_rate: percentage of responses that include citations for the actor (
citations_count/prompt_executions_count× 100). •day: daily ratio. •week/month: ratio-of-period-sums with sticky carry, same as visibility. - AI Visibility Score
ai_visibility_score: position-weighted visibility metric that accounts for mention prominence. Uses reciprocal position weighting (position 1 = 100%, position 2 = 50%, position 3 = 33%, etc.). Higher scores indicate both more mentions AND better positioning. •day: compute daily weighted score / executions. •week/month: ratio-of-period-sums with sticky carry, same as visibility. - avg_position: daily average excluding nulls. •
week/month: average within the period (ignoring nulls) and then propagate (carry) the last known value to days without data — matching the Overview chart smoothing. - avg_mention_position: average position of the brand when mentioned in AI responses (position 1 = first mentioned, position 2 = second, etc.). Lower is better. •
day: daily average excluding nulls. •week/month: average within the period with sticky carry. - Sentiment metrics
sentiment_very_positive,sentiment_positive,sentiment_neutral,sentiment_negative,sentiment_very_negative: for each actor and day, percentage of sentiments in that bucket over all sentiments for that actor. •day: daily ratio (bucket_count / total_sentiments * 100). Days with no sentiments returnnull. •week/month: we compute a ratio-of-period-sums (Σ bucket / Σ total * 100) and repeat that percentage for every day in the period. If the period’s denominator is 0, we carry forward the last non-null value (sticky), matching the Overview smoothing. - Net Sentiment Score
net_sentiment: para cada actor y día, calculamos un score en [-100, 100]: ( (very_positive + positive) − (negative + very_negative) ) / total_sentiments × 100. •day: usamos los porcentajes diarios de cada bucket (las métricassentiment_*) y calculamosnet = (pos+very_pos) − (neg+very_neg). •week/month: el score hereda las mismas semánticas de agregación/smoothing que los buckets de sentiment, porque se calcula a partir de esas series.
In /metrics/summary, total is a sum for count metrics and an average for avg_position, avg_mention_position, and net_sentiment.
GET /metrics/timeseries
Returns time series for one or more metrics, grouped by actor (your project + selected competitors). Weekly/monthly values follow the period semantics above. Optional prompt_type (search intent) and brand_kind filters scope every metric to a prompt category.
GET /metrics/summary
Aggregates per actor and metric (total/min/max/last). Ideal for KPI tiles.
GET /metrics/prompt_summary
Returns paginated per-prompt aggregated metrics (responses, mentions, citations, mention_rate, citation_rate, avg_mention_position, avg_position). Supports breakdown=model to add the AI model dimension to each row, returning per-prompt per-model metrics. Params: sort (responses, mentions, citations, mention_rate or visibility, citation_rate, avg_mention_position, avg_position), sort_dir (asc/desc), breakdown (model), page, per_page (max 100).
GET /metrics/sov
Share of Voice based on mentions, aligned with Overview.
- over_time: for each date,
SOV = (actor_mentions / sum_all_mentions) × 100. If the daily sum is 0, the last value is carried forward (sticky). - current: uses the latest date with non-zero total; if none, it uses totals over the whole range.
- breakdown: top 4 actors + an aggregated Others row (and a detailed
otherslist).
GET /metrics/top_sources
Ranks source domains by number of responses and average mention rate (% of executions that surfaced that domain).
- The dataset includes non-rejected sources linked to prompt executions within the window and current filters.
total_responses: number of unique prompt executions that produced at least one source on that domain.avg_mention_rate(also returned asavg_visibility):(count of source rows for the domain / total executions) × 100.- Sorting:
sort=total_responses(default),sort=avg_mention_rate, orsort=avg_visibility. - Pagination:
page(>=1),per_page(default 20, max 100). - Filter by domain:
query(case-insensitiveLIKE) — e.g.query=github.
Cache & Conditional GET
Metrics endpoints (timeseries, summary, sov, top_sources) support conditional GET. We compute an ETag from the project version and a hash of your query params, and use the project’s updated_at as Last-Modified.
Send If-None-Match or If-Modified-Since to receive 304 Not Modified when nothing changed.
Errors
Errors are consistent and machine-parsable:
| Code | HTTP | Meaning |
|---|---|---|
| ERR_MISSING_AUTH | 401 | Missing or malformed Authorization header |
| ERR_INVALID_API_KEY | 401 | Token not recognized |
| ERR_REVOKED_API_KEY | 403 | Key revoked |
| ERR_PROJECT_NOT_FOUND | 404 | project_id not accessible by this user |
| ERR_NOT_FOUND | 404 | Resource not found |
| ERR_INVALID_PARAM | 422 | Validation failed (see message) |
| ERR_LIMIT_REACHED | 422 | Account prompt limit reached |
| ERR_QUOTA_EXCEEDED | 422 | Monthly intelligence task quota exceeded |
Error body shape:
Typical 422 cases:
invalid metrics— onlymentions, citations, responses, mention_rate (or visibility), citation_rate, ai_visibility_score, avg_position, avg_mention_position, sentiment_very_positive, sentiment_positive, sentiment_neutral, sentiment_negative, sentiment_very_negative, net_sentimentare allowed.invalid granularity— must beday|week|month.from/to must be ISO8601, orfrom is required with to.range is requiredwhen neitherfromnortoare sent.unknown competitor ids: ...— IDs not found under the project.
Client snippets
Examples in multiple languages are shown in the code panel on the right.
Postman — Download & Environment
Use this curated Postman collection to explore the API quickly and securely. It mirrors the examples and metric semantics described above (period totals with sticky carry, ratio-of-period-sums for visibility, and propagation for avg_position), so you can validate responses and prototype integrations in minutes.
Download the collection
Download LLMPulse API v1 Postman Collection
Import the file in Postman (File → Import), then select or create the environment shown below. The collection uses variables, so you won’t need to edit each request manually.
Environment (placeholders — keep your IDs private)
Create a new Environment in Postman with the following variables. Use placeholders instead of real IDs or keys in any public context (docs, screenshots, etc.):
How it’s used:
- The collection reads
{{base_url}}and injectsAuthorization: Bearer {{api_key}}automatically. - Set
{{project_id}}to a project you own;{{competitors}}is CSV (e.g.1,2,3). - You can override per request (e.g. send
from/toinstead ofrange) and add filters likemodel,collection_id,country_code,language_code. - Keep your API key in your private environment only; do not paste it into shared documents.
MCP (AI Integration)
MCP (Model Context Protocol) allows AI assistants like ChatGPT, Claude and Gemini to access your LLM Pulse data directly. Available on every plan via OAuth — no API key required. Ask questions in natural language and let the AI fetch and analyze your visibility data.
What is MCP?
MCP is an open protocol that lets AI assistants connect to external data sources. Instead of copying data or making API calls manually, you can simply ask your AI assistant questions like "What's my visibility trend this month?" and it will fetch the data automatically.
Endpoint
Configuration
Recommended for every plan: paste the MCP URL into your AI client. The client handles OAuth automatically — no token to copy. API-key auth (Bearer header) is available on the Scale plan and above for headless integrations.
Available Tools
These tools are available to your AI assistant.
Live list rendered from Mcp::LlmPulseServer::TOOLS (47 tools registered). The MCP server filters tools/list per user plan.
| Tool | Description | Plan |
|---|---|---|
| list_projects | List all projects accessible to the authenticated user. Returns project id and name. | All |
| list_competitors | List all competitors for a specific project. Returns competitor id, name, and domain. | All |
| list_collections | List all collections (tags) for a specific project. Returns collection id and name. | All |
| list_tags | List all tags for a specific project. In LLM Pulse, tags are represented by collections. | All |
| list_models | List all AI models that have data for a specific project. Returns model identifiers (e.g., chatgpt-4o, perplexity, gemini). | All |
| list_locales | List all countries and languages that have data for a specific project. Returns lists of country codes (e.g., US, ES) and language codes (e.g., en, es). | All |
| list_sentiments | List all sentiment categories with their metric keys, labels, and colors. Used for understanding sentiment data structure. | All |
| list_prompts | List prompts for a project with optional filtering by collection, locale, prompt_type, brand_kind, and date range. Returns paginated results with prompt id, prompt_text, collection_id, country_code, language_code, prompt_type, brand_kind, and last_executed_at. | All |
| list_prompt_executions | List prompt executions with model, success, execution timing, fan-out queries, and mention/citation presence. | All |
| list_mentions | List brand mentions for a project with optional filtering. Returns paginated results with mention id, name, prompt_id, prompt_execution_id, and created_at. | All |
| list_citations | List URL citations for a project with optional filtering. Returns paginated results with citation id, name, domain, prompt_id, prompt_execution_id, url, position, and created_at. | All |
| list_competitor_mentions | List competitor mentions for a project with optional competitor and prompt filters. | All |
| list_competitor_citations | List competitor citations for a project with optional competitor and prompt filters. | All |
| list_all_mentions | List all mentions (brand + competitor) for a project with actor_type field. Returns paginated results combining project and competitor mentions. | All |
| list_all_citations | List all citations (brand + competitor) for a project with actor_type field. Returns paginated results combining project and competitor citations. | All |
| list_sources | List sources (URLs cited by AI models) for a project with optional filtering. Returns paginated results with source id, prompt_execution_id, domain, url, and position. | All |
| list_citation_groups | List grouped citation intelligence data by URL, domain, or host, including citation rates, model breakdowns, and page-cache awareness. | All |
| get_cited_url_details | Get detailed URL-level citation intelligence for one cited URL, including page-cache metadata and mention evidence. | All |
| list_cited_url_occurrences | List every prompt execution where a specific cited URL appeared, with prompt text, answer preview, model, and citation position. | All |
| get_cited_url_content | Get sanitized cached page content plus page-cache metadata and mention snippets for one cited URL. | All |
| get_timeseries | Get time series metrics data for a project. Supports metrics like mentions, citations, mention_rate (also accepted as visibility), citation_rate, responses, ai_visibility_score (position-weighted visibility), avg_position, net_sentiment, and sentiment breakdowns. Returns data points over time for the project and optionally competitors. | All |
| get_summary | Get summary statistics for metrics over a time period. Returns total, min, max, and last values for each metric and actor. Built on top of timeseries data. | All |
| get_prompt_summary | Get per-prompt aggregated metrics (responses, mentions, citations, mention_rate, citation_rate, avg_mention_position, avg_position) with pagination and sorting. mention_rate (also accepted as visibility) is the percentage of responses mentioning the brand. Returns brand-only metrics broken down by individual prompt. Supports breakdown=model to get per-prompt per-model metrics. | All |
| get_sov | Get Share of Voice metrics - shows the relative share of mentions between the project and competitors over time. Returns current share percentages and breakdown by actor. | All |
| get_top_sources | Get top performing source domains for a project. Returns domains ranked by total responses or average mention rate (also accepted as avg_visibility), with pagination support. | All |
| get_ai_model_summary | Per-AI-model breakdown of mentions, citations, sentiment and weighted visibility for the brand and competitors, in a single call. USE THIS for any question that compares performance across AI models ("which model do I rank best on?", "ChatGPT vs Perplexity vs Gemini", "where am I most visible across models?"). Prefer this over calling get_summary multiple times with different model filters — get_ai_model_summary returns all models at once and avoids hitting the step limit. | All |
| get_ai_model_position_distribution | Get the AI Model Insights position-distribution comparison for the project brand and an optional competitor. | All |
| get_ai_overview_results | Get aggregate Google AI Overview result availability over time plus per-prompt breakdowns. | All |
| list_answers | List AI answers/responses with their content, prompt text, model, and basic metrics. Returns paginated results with truncated response text. | All |
| get_answer | Get detailed information about a single AI answer/response including full response text, mentions, citations, sentiments, and sources. | All |
| list_detailed_sentiments | List detailed sentiment analysis records with comments, topics, scores, and competitor information. This is different from list_sentiments which only returns sentiment categories. | All |
| list_recommendations | List read-only recommendation runs for a project, including type, status, summary, and counts. | All |
| get_recommendation | Get full details for one recommendation run, including items, source references, and report data. | All |
| get_project_details | Get detailed information about a project including matching names, industry, business model, primary products, target audience, and basic statistics. | All |
| get_competitor_details | Get detailed information about a competitor including matching names, mobile app IDs, and icon URLs. | All |
| create_prompts | Add prompts to a project in bulk. Validates against available prompt limits. Skips duplicates. | All |
| create_intelligence_task | Create a content intelligence task. task_type selects what is produced: "brief" = content brief/outline for a topic, "create" = full draft article, "update" = rewrite/improve existing content (requires existing_content or existing_content_url), "pr_insights" = PR/media angle analysis, "custom" = freeform output driven by user_instructions. Pass prompt_id to base the task on an existing prompt, or omit it for agentic mode (then custom_topic or user_instructions is required). Returns task ID for polling status with get_intelligence_task. | All |
| create_competitor | Add a competitor to a project. Validates against the plan's max competitor limit. Triggers async association recalculation. | All |
| create_collection | Create a tag (Collection) in a project. Optionally attach existing prompts in the same call. Tag name is unique per project (case-insensitive). | All |
| assign_prompt_tags | Attach tags (collections) to existing prompts in bulk. Provide tag_ids for known tags, or tag_names to look up by name (case-insensitive). Pass create_missing=true to create tag names that do not exist yet. Idempotent: re-running with the same input does not duplicate assignments. | All |
| create_annotation | Mark a date in the project timeseries with a title + description. Useful when the agent detects a notable change (campaign launch, product update, news event) and wants to flag it. Annotations are scoped to the project and visible to all members. | Growth |
| launch_recommendations | Re-generate AI-powered recommendations for a project. Costly (OpenAI calls, long-running job), so the tool returns a preview + a confirmation token; the user must click Confirm in the UI to actually launch the job. Each recommendation_type has a one-per-week regeneration cap (admins exempted). | All |
| create_technical_geo_report | Run the full technical GEO analysis bundle (crawlability, schema, content readiness, discoverability, site structure, robots.txt, llms.txt, AI visibility) for a given URL + country. Costly (multiple jobs, BrightData/OpenAI), so the tool returns a preview + confirmation token; the user must click Confirm in the UI to actually launch the reports. | All |
| list_intelligence_tasks | List content intelligence tasks for a project with optional filtering by type and status. | All |
| get_intelligence_task | Get a content intelligence task by ID, including status and result data when completed. | All |
| get_agent_traffic | Get aggregated AI bot traffic for a project from Cloudflare or uploaded server logs. Returns per-day request counts grouped by bot or by company. Available on Scale and above plans. | Scale |
| list_agent_bots | List the catalog of known AI bots (crawlers, assistants, search fetchers) and their parent companies. Use this to discover valid bot slugs and company names for the bot/company filters of get_agent_traffic. Returns each bot's slug, display name, company, category, and description. Available on Scale and above plans. | Scale |
Protocol
MCP uses JSON-RPC 2.0. Here's an example of listing available tools:
For a simpler guide, see the MCP Setup page.
OAuth 2.1 (ChatGPT Apps SDK, MCP clients)
OAuth 2.1 authorization server with PKCE-S256, Dynamic Client Registration (RFC 7591), and discovery metadata (RFC 8414 + RFC 9728). Used by ChatGPT Apps SDK and any other MCP client that supports OAuth. Available to all plans for the MCP resource at /api/v1/mcp. Access tokens are RS256-signed JWTs with a 1-hour TTL; refresh tokens last 30 days and are rotated on every use.
OAuth 2.1 Overview
Use OAuth 2.1 when your client needs per-user delegated access to the MCP endpoint and you cannot ship an API key (e.g., a multi-tenant AI assistant). Use API keys when you control both ends and want a simpler integration (Scale plan and above). MCP via OAuth is available on every plan including the free trial.
Endpoints: /oauth/authorize, /oauth/token, /oauth/register, /oauth/jwks.json, /.well-known/oauth-authorization-server, /.well-known/oauth-protected-resource.
GET /.well-known/oauth-authorization-server
Authorization-server metadata at /.well-known/oauth-authorization-server (RFC 8414) and protected-resource metadata at /.well-known/oauth-protected-resource (RFC 9728). The JWKS used to verify access-token signatures lives at /oauth/jwks.json. Clients should fetch these to discover the authorize, token, and registration endpoints — never hard-code them.
No parameters. Returns JSON with issuer, authorization_endpoint, token_endpoint, registration_endpoint, jwks_uri, scopes_supported, code_challenge_methods_supported, and related metadata.
POST /oauth/register
Dynamic Client Registration per RFC 7591. Unauthenticated and rate-limited to 5/hour per IP. Only RFC 7591 fields are persisted (extra fields are dropped). Redirect URIs must be HTTPS (any host) or HTTP loopback (localhost / 127.0.0.1); custom schemes like javascript:, data:, file: are rejected. Maximum 10 redirect URIs per client; client_name capped at 200 chars; URIs capped at 2048 chars.
JSON body: redirect_uris (required array), client_name, grant_types (defaults to authorization_code refresh_token), token_endpoint_auth_method (none for public PKCE clients, client_secret_post for confidential), scope.
GET /oauth/authorize
Renders an in-app consent screen. On approval, redirects the user back to redirect_uri with a single-use code (10-minute TTL) and the original state. PKCE-S256 is mandatory; plain challenges are rejected.
Params: response_type=code (required), client_id (required), redirect_uri (required, must match a registered URI exactly), code_challenge (required), code_challenge_method=S256 (required), scope (space-separated: mcp:read mcp:write), state, resource (RFC 8707 resource indicator).
POST /oauth/token
Exchanges an authorization code for an access token + refresh token, or refreshes an access token. Uses application/x-www-form-urlencoded. Rate-limited to 60/minute per IP. Refresh tokens are rotated on each use; the old refresh token is revoked immediately.
Body: grant_type (authorization_code or refresh_token), client_id (required), client_secret (required for confidential clients), and either {code, code_verifier, redirect_uri} OR {refresh_token, optional scope for downscoping}.
Scopes & Audience Verification
Two scopes are defined. mcp:read grants access to every read tool (list_*, get_*). mcp:write additionally grants the write tools (create_prompts, create_competitor, create_collection, assign_prompt_tags, create_annotation, create_intelligence_task, launch_recommendations, create_technical_geo_report). A token issued with only mcp:read cannot invoke write tools — both tools/list hides them and direct tools/call returns an error. The JWT aud claim must equal the resource server URL; tokens with a different audience are rejected at /api/v1/mcp.
When refreshing a token, you MAY pass a narrower scope — anything broader than the original grant returns invalid_grant.
Changelog
- 2025-08: Initial public API docs (v1)
- 2025-09: Metrics aligned with Overview (period totals with sticky, ratio-of-period-sums for visibility, propagation in avg_position), SOV breakdown,
queryfilter in Top Sources, caching notes, Postman download & environment section - 2025-12: Sentiment metrics added to /metrics/timeseries (sentiment_very_positive/positive/neutral/negative/very_negative) and documented semantics
- 2026-01: Added MCP (Model Context Protocol) endpoint for AI integrations with Claude, ChatGPT, and other AI assistants
- 2026-02: Added
ai_visibility_scoremetric (position-weighted visibility). New MCP tools: list_answers, get_answer, list_detailed_sentiments, get_project_details, get_competitor_details. New API endpoints: /answers, /sentiments, /dimensions/projects/:id, /dimensions/competitors/:id. Addedresponsesmetric (prompt execution count) andcitation_ratemetric (citations / responses x 100). API rate limits increased from 100 to 300 requests/minute. Addedpromptfilter to all metrics and dimensions endpoints. - 2026-03: New endpoint
GET /metrics/prompt_summaryfor paginated per-prompt metrics (responses, mentions, citations, visibility, citation_rate) in a single request - 2026-04: New
POST /promptsendpoint for bulk prompt creation (up to 100 per request). New Content Intelligence API:POST /intelligence_tasksto create tasks,GET /intelligence_tasksto list with filters,GET /intelligence_tasks/:idfor full details and results. New MCP tools: create_prompts, create_intelligence_task, list_intelligence_tasks, get_intelligence_task. New error codes:ERR_LIMIT_REACHED(prompt quota),ERR_QUOTA_EXCEEDED(intelligence task quota),ERR_NOT_FOUND(resource not found). - 2026-04 (mid): Citation Intelligence API:
GET /citation_intelligence/groups(cited-URL clusters with source/type filters),GET /citation_intelligence/urls/:url_sha256,/occurrencesand/contentfor per-URL drill-down. AI Model Insights Reports API:GET /reports/ai_model_insights/summary,/position_distributionand/ai_overview_results. Recommendations API:GET /recommendationsandGET /recommendations/:id. New MCP tools: list_citation_groups, get_cited_url_details, list_cited_url_occurrences, get_cited_url_content, get_ai_model_summary, get_ai_model_position_distribution, get_ai_overview_results, list_recommendations, get_recommendation, list_competitor_mentions, list_competitor_citations, list_prompt_executions, list_tags. Stricter enum validation acrossview,order,direction,granularity,model,source_type,sentiment,content_gap,recommendation_type,status— unknown values now returnERR_INVALID_PARAMinstead of being silently ignored.source_typefilter acceptsowned,competitor,third_partyin addition to classification lists. AI Overview results bucket byexecuted_at(notcreated_at), so retried/backfilled rows land in the correct day. - 2026-04 (late): Agent Analytics API (Scale+, Beta):
GET /metrics/agent_trafficandGET /dimensions/agent_botssurface AI bot crawler traffic (GPTBot, PerplexityBot, ClaudeBot, OAI-SearchBot, Google-Extended, and ~25 others) from Cloudflare or CSV uploads. New MCP tool:get_agent_traffic. MCPtools/listis now filtered by your plan — tools you can't use no longer appear in the catalog, and direct calls to gated tools return a cleanERR_PLAN_REQUIREDinstead of leaking schema. MCP auth boundaries hardened for member-of-owner access. - 2026-05: Projects now expose
brand_nameseparately fromnamein API and MCP payloads.brand_nameis the brand label sent to LLMs and shown in customer-facing charts;nameremains the internal project label.nameis still returned for back-compat.mention_rateaccepted as a synonym forvisibilityin/metrics/*params and in MCP timeseries / summary / top_sources tools. Per-user AI model flags now apply to every read endpoint: API responses, metrics, dimensions, answers, sentiments and citations silently exclude models that aren't enabled for the API key's user (used by add-on models — Copilot, Claude, Grok, DeepSeek, Meta AI — so partners can sell them à la carte). Date-bucketed metrics standardized onEurope/Madridfor daily/weekly/monthly buckets, fixing off-by-one-day rows near midnight UTC. - 2026-05 (mid): Agent Write Endpoints (v1.5). API keys now expose a
scope(readvsread_write); pre-existing keys treatfullas a synonym ofread_write. Mutation endpoints (POST/PATCH/PUT/DELETE) now require aread_writescope key and return403 ERR_INSUFFICIENT_SCOPEotherwise. A second rate-limit bucket (60/min/key) is enforced on writes on top of the global 300/min/key budget. New REST endpoints:POST /competitors,POST /collections,POST /prompts/assign_tags(idempotent bulk tagging),POST /annotations(Growth+),POST /technical_geo_reports(full GEO bundle). New MCP write tools:create_competitor,create_collection,assign_prompt_tags,create_annotation,launch_recommendations(with pre-hoc user confirmation in the chat agent),create_technical_geo_report(idem). New error codes:ERR_INSUFFICIENT_SCOPE(403) for read-only keys hitting writes,ERR_PLAN_REQUIRED(403) for annotations on Starter. - 2026-05 (late): Prompt categorization filters. Every prompt is now auto-classified by
prompt_type(search intent:informational,navigational,commercial,transactional) andbrand_kind(brand= your own brand/products,brand_other= competitors or other brands,non_brand= generic, no brand named). Both are accepted as optional filters on/metrics/timeseries,/metrics/summary,/metrics/sov,/metrics/prompt_summary,/metrics/top_sourcesand/dimensions/prompts(which now also returns the two fields per prompt). Invalid values returnERR_INVALID_PARAM. The same filters are available asprompt_type/brand_kindargs on the MCP toolsget_timeseries,get_summary,get_sovandlist_prompts. - 2026-05 (late): New recommendation type: Sentiment & Reputation (Scale+).
recommendation_typeonGET /recommendations(and thelaunch_recommendationsMCP tool) now acceptssentiment_reputationin addition toai_visibility,social_communityandbrand_building. It turns the last 30 days of brand sentiment (widening to 90 if sparse) — negative themes, comparative gaps where a competitor is praised, the cited sources behind negative answers, and weak reputation dimensions — into actionable recommendations. Requires the Scale plan or above; non-entitled users getERR_INVALID_PARAM/plan errors. - 2026-05 (late): MCP available on every plan via OAuth. The MCP endpoint (
POST /api/v1/mcp) now accepts OAuth 2.1 access tokens issued via Dynamic Client Registration (RFC 7591) and PKCE-S256. Any LLM Pulse user — including Starter, Growth and trial users — can connect ChatGPT, Claude, Gemini, Cursor or any other MCP-compatible client to their account by pasting the URLhttps://api.llmpulse.ai/api/v1/mcpinto their client's MCP / connector settings; the client walks the user through an OAuth sign-in flow with no API key required. Per-tool plan gating still applies: write tools and advanced read tools that require Growth or Scale continue to be filtered out oftools/listfor users without access. API-key auth (Authorization: Bearer …) is unchanged and remains the recommended path for headless integrations like Looker Studio, Zapier and CI scripts (Scale plan and above). Discovery endpoints (/.well-known/oauth-authorization-server,/.well-known/oauth-protected-resource,/oauth/jwks.json) and registration/authorize/token endpoints live under/oauth/*.