API Changelog

Every change to the REST API and MCP tools, newest first.

  1. 2026-10-25 (v1.71.0)

    No API for accounts that do not pay, tracked state of projects and prompts, and webhook removal below Scale. Every REST and MCP request, reads and OAuth included, returns 403 ERR_ACCOUNT_INACTIVE when the account never subscribed or its subscription ended over three days ago, and its webhooks deliver nothing until it pays. Invoice-billed accounts are exempt. From the paid-through date, paid work (GEO Writer, technical GEO reports, GEO audit runs, recommendations, prompt suggestions, project drafts, ask_support) answers the same code and new prompts get no first run. Projects, project details and prompts return tracked and untracked_reason, and POST /prompts and /prompts/import add a warning when they will not run. GET /webhooks and DELETE /webhooks/:id work on every plan, to remove a subscription paused below Scale. GEO audits gain paused_reason quota, public_link_active needs an active account on the Scale tier or higher, and Sentiment & Reputation recommendation runs answer ERR_NOT_FOUND without reputation access.

  2. 2026-10-24 (v1.70.0)

    Filters the API already accepted are now in the contract, and range applies on the listings. The OpenAPI and Swagger documents, and so the SDKs, the CLI and the connectors, now list parameters these endpoints read but did not document: country_code, language_code and include_project on GET /metrics/summary and GET /metrics/sov; collection_ids and domains on GET /metrics/top_sources; prompt_type, brand_kind and range on GET /dimensions/mentions, /citations, /competitor_mentions, /competitor_citations, /all_mentions, /all_citations and /sources (plus country_code and language_code on the competitor and combined listings); and prompt_type and brand_kind on GET /dimensions/prompt_executions. Behaviour correction: range on those seven REST listings used to be ignored, so they returned the whole history; they now keep the last N days, as their MCP tools already did; an explicit from or to still wins, and a range that is not a single positive number, or that exceeds 1,500 days, returns ERR_INVALID_PARAM. domains on GET /metrics/top_sources and GET /citation_intelligence/mentions_by_domain, and collection_ids on GET /metrics/top_sources, take one value or a comma-separated list (domains=gmac.com,educaweb.com), and the bracket form domains[]= still works. A comma-separated domains used to match no domain, and a client that repeated the key (domains=a&domains=b, as most generated SDKs did for mentions_by_domain) got only the last one; regenerated SDKs send the comma-separated form. model on GET /reports/ai_model_insights/position_distribution now lists only the seven models the endpoint accepts; other values were already refused with ERR_INVALID_PARAM. status on GET /intelligence_tasks now lists its values. MCP tools are unchanged.

  3. 2026-10-23 (v1.69.0)

    Archive reasons and effort for recommendation items. PATCH /recommendations/:id/items/:item_id and update_recommendation_item accept an optional reason when archiving (not_relevant, too_complex or competitor), which later recommendation runs learn from; it is returned as metadata.archive_reason. New items carry metadata.effort (low, medium or high).

  4. 2026-10-22 (v1.68.0)

    Several Search Console properties per project. New GET /search_console/properties (MCP list_search_console_properties) lists up to 10 connected properties. Every Search Console read takes property: one property id, or a comma-separated list or all to combine several, answered with properties, excluded_properties (already counted by another selected property) and property_errors. property is also a summary dimension and a rows dimension, and project details report search_console.properties_count.

  5. 2026-10-21 (v1.67.0)

    Data connection status and connect links. GET /dimensions/projects/:id and get_project_details now return ai_traffic and agent_traffic next to search_console, so a client can see which data sources a project has before calling their endpoints. Each has a status (connected, reconnect_required or not_connected, plus imported when agent traffic comes only from imported logs), the connected property or provider, and connect_url, the page where the user connects or reconnects it. Not-connected and access-revoked errors from the Search Console, AI traffic, web analytics and agent traffic endpoints carry the same link in error.meta.connect_url, and their MCP tools return it as connect_url. Nothing else in these responses changes.

  6. 2026-10-19 (v1.66.0)

    Masked webhook URLs, webhook pauses below Scale, plan-gated answer fields and import permissions. GET /webhooks and the list_webhook_subscriptions MCP tool now show a read-only API key, or an MCP OAuth connection without mcp:write, only the scheme, host and any non-default port of target_url followed by /… (for example https://hook.eu1.make.com/…), because the full URL can let anyone post to the receiver. A read_write key, or a connection with mcp:write, still gets the full URL. A subscription created by an API key limited to some projects stops for good once that key no longer covers the subscription's project: it is listed with disabled: true, and creating it again with the same project, event and URL replaces it with a new subscription and secret. While the account is below the Scale plan, its subscriptions are kept but deliver nothing: no failed delivery is counted and none is disabled. Deliveries resume once the account is back on Scale or above, and events from that period are not resent. GET /answers/:id now leaves out sentiments below the Growth plan and shopping_products below the Scale plan, as the get_answer MCP tool already did. Both return plan_required_fields, the list of fields left out, always present and empty when nothing is left out; get_answer used to return it as an object naming the plan of each field, and only when one was left out. In POST /prompts/import and the import_prompts MCP tool, a row that needs a tag that does not exist yet is skipped for a team member without create access to Tags, and a row matching a prompt that already existed adds no tags to it for a team member without update access to Prompts (the row is listed when it would have added one). Both come back in row_errors, next to the rows skipped for giving a prompt more than 50 tags or taking the request past 500 new tags, limits the import description now states.

  7. 2026-10-19 (v1.65.0)

    Limits on matching names. matching_names now takes at most 50 names of up to 100 characters each on POST /projects, PATCH /projects/:id, POST /competitors, PATCH /competitors/:id and POST /project_drafts/:id/finalize, and on the MCP tools create_project, update_project, create_competitor, update_competitor and finalize_project_draft. The 50 include the brand name that POST /competitors and PATCH /competitors/:id add to the list. A longer list or name returns ERR_INVALID_PARAM (422) and nothing in the request is applied. The steps of PATCH /project_drafts/:id still store the lists as sent, and finalize checks them. The OpenAPI request schemas declare both limits as maxItems and maxLength. A list saved before this change keeps working until it is edited.

  8. 2026-10-16 (v1.64.0)

    Project prompt limits in the API and MCP. GET /dimensions/projects/:id and get_project_details return prompt_limit (null without one) and stats.prompts_available, how many prompts the project can still take: the lower of its room under that limit and the account's remaining prompts, 0 at worst and null only when neither applies. PATCH /projects/:id and the MCP tool update_project accept a whole-number prompt_limit from 1 to 2147483647, or null to remove it. Only the account owner or an account admin (co-owner) with the Projects update permission can change it: other team members get ERR_INSUFFICIENT_PERMISSION, a key limited to some projects gets ERR_KEY_PROJECT_SCOPED, and a refused request applies nothing. Values such as "5" or 5.0 return ERR_INVALID_PARAM. A limit below the current count deletes no prompt; new ones are refused until the project is under it. A request sending only prompt_limit is saved even during a recalculation.

  9. 2026-10-15 (v1.63.0)

    More of the app, in the API and MCP. GET /custom_reports, GET /custom_reports/:id and POST /custom_reports/:id/send (list_custom_reports, get_custom_report, send_custom_report) list, read and send custom reports. PATCH /recommendations/:id/items/:item_id (update_recommendation_item) completes, archives or restores a recommendation item. GET /reports/sentiment/topics and GET /reports/sentiment/tags (get_sentiment_topics, get_sentiment_tags) return sentiment by topic and by tag, like the Sentiment page. GET /competitors/suggestions (list_competitor_suggestions) returns the suggested competitors and the most cited domains of the Competitors page.

  10. 2026-10-15 (v1.63.0)

    Owned media and social profiles in the API. GET /dimensions/owned_media/summary (get_owned_media_summary) returns the numbers behind each Owned Media tab, YouTube and LinkedIn among them: citations of the platform, the share that cites your profiles and content, the change against the previous period, weekly citations and the splits by AI model, country, content type and age. GET /dimensions/owned_media/citing_prompts (list_owned_media_citing_prompts) lists the answers citing one post, video or profile. GET /projects/:id/owned_media and PATCH /projects/:id/owned_media (get_owned_media_profiles, update_owned_media_profiles) read and set the profiles that count as yours, like Project Settings > Owned Media.

  11. 2026-10-15 (v1.63.0)

    Every way to add prompts, through the API. POST /prompts/import and the import_prompts MCP tool take up to 500 rows, each with its own country, language and tags, like the CSV import. POST /prompt_generations and generate_prompt_suggestions start the suggestion generators of the app (website, keyword, topic, Reddit, People Also Ask, reputational, translate and Search Console) and answer 202 with a run to follow at GET /prompt_generations/:id (get_prompt_generation). The ideas land in the suggestion queue: GET /suggested_prompts (list_suggested_prompts) lists it, POST /suggested_prompts/accept turns ideas into tracked prompts and POST /suggested_prompts/reject dismisses them (accept_suggested_prompts, reject_suggested_prompts). POST /prompts/remove_tags is now the REST twin of the remove_prompt_tags MCP tool, and PATCH /prompts/:id (update_prompt_categorization) sets the search intent and brand focus of a prompt by hand.

  12. 2026-10-14 (v1.62.0)

    Citations per period for a cited URL, domain or host. GET /citation_intelligence/urls/:url_sha256 and the get_cited_url_details MCP tool accept include_series=true, which adds citation_series: the answers citing the URL per AI model (by_model) and per period (data), by day, week or month as the account tracking cadence sets (granularity), with total equal to stats.total_responses. Periods date each answer by executed_at in Europe/Madrid time. Without include_series the response is unchanged. The endpoint now documents the filters it already applied (model, collection_id, country_code, language_code, prompt, from, to, source_type, sentiment and content_gap) and accepts brand_kind. For a domain or host, GET /citation_intelligence/groups and the list_citation_groups MCP tool accept key, which returns only that group of the chosen view, and with a key include_series=true adds the same citation_series to its row; include_series without key returns ERR_INVALID_PARAM (422). GET /citation_intelligence/groups also applies brand_kind, which it used to ignore.

  13. 2026-10-14 (v1.62.0)

    Product listing markup is cleaned, not refused. On a product_listing task, PATCH /intelligence_tasks/:id and the update_intelligence_task_content MCP tool keep only p, ul, ol, li, strong, em, h3 and br in description_html, with no attributes. Other markup and every attribute are stripped and the edit still succeeds, so read the stored value from the response. POST /intelligence_tasks/:id/revert restores the generated description cleaned the same way.

  14. 2026-10-14 (v1.62.0)

    A declined answer is a sentinel non-answer too. When the model declines to answer a prompt (today only Gemini, because of its safety filters or a restricted topic), GET /answers, GET /answers/:id and the list_answers and get_answer MCP tools return that run with no_result: true and the usual placeholder text, like a run where the provider returned nothing after all retries. Such a run is not retried and stays out of every platform metric. The response shape is unchanged; the no_result descriptions now name both causes.

  15. 2026-10-14 (v1.61.0)

    Webhook secret only for the credential that created the subscription. Re-posting the same project, event and URL to POST /webhooks, or calling the create_webhook_subscription MCP tool again, still returns the existing subscription as before, but includes secret only when the call comes from the API key or OAuth connection that created it. Any other API key or OAuth connection gets the subscription without secret, so it can no longer read a signing secret it was not given. A subscription created over an MCP OAuth connection before v1.58.0 has no recorded creator, so it never returns secret again. A new subscription, including one that replaces a subscription whose creating API key or OAuth connection was revoked, still returns secret. To get a new secret for an existing subscription, delete it and create it again.

  16. 2026-10-12 (v1.60.0)

    A code on every MCP tool error. Every failing tools/call now carries code next to error, with the value the REST endpoint returns for the same state; until now some tool errors carried only error, and the two refusals made before a tool runs (missing required arguments, a value the input schema rejects) came as plain text, not as a JSON object with error. Missing or invalid arguments, including values a tool's input schema rejects before it runs, return ERR_INVALID_PARAM. An unknown project returns ERR_PROJECT_NOT_FOUND on every tool, and another missing record ERR_NOT_FOUND (ERR_DRAFT_NOT_FOUND for drafts). A tool refused for an OAuth scope or a read-only key returns ERR_INSUFFICIENT_SCOPE, for team-member permissions ERR_INSUFFICIENT_PERMISSION, and on a white-label portal ERR_INTEGRATION_UNAVAILABLE. Budgets and daily limits return ERR_LIMIT_REACHED or ERR_QUOTA_EXCEEDED, as on REST. The error text is unchanged.

  17. 2026-10-12 (v1.60.0)

    Unknown or differently cased source_type refused on GET /dimensions/sources. GET /dimensions/sources used to ignore an unknown source_type, or the array form source_type[], and list every source, while a differently cased value such as Owned was applied as owned. It now accepts exactly owned, competitor or third_party; any other value, Owned and OWNED included, returns ERR_INVALID_PARAM (422) with the accepted values. The list_sources MCP tool refuses the same values with the same code.

  18. 2026-10-12 (v1.60.0)

    Additional owned domains through the API. PATCH /projects/:id and the update_project MCP tool accept additional_owned_domains, the other domains the brand owns whose citations count as owned, which until now could only be edited in the app. It is a full replacement list of up to 10 domains, and [] clears it. A pasted URL is stored as its domain. The app's rules apply: a subdomain, a platform many companies share (such as youtube.com, amazon.com or wordpress.com), the project website or a domain a competitor tracks is refused with ERR_INVALID_PARAM and the reason. GET /dimensions/projects/:id and get_project_details return the list.

  19. 2026-10-12 (v1.60.0)

    Additional owned domains: recalculation and owner-only changes. A change to additional_owned_domains reprocesses, in the background, the past answers that cite an added or removed domain (rematching: true); a reordered or identical list starts nothing. Only the account owner can send it: a team member key or connection, a co-owner's included, gets ERR_INSUFFICIENT_PERMISSION and nothing in the request is applied. A request is applied whole or not at all, and one sent with matching_names starts a single recalculation. The response project returns the list, and PATCH /projects/:id now publishes its response schema. While a recalculation runs, PATCH /projects/:id and the update_project MCP tool refuse further edits with ERR_INVALID_PARAM; that message no longer promises a wait of a few minutes and now asks to try again once the recalculation finishes.

  20. 2026-10-12 (v1.60.0)

    What a competitor deletion keeps. DELETE /competitors/:id and the delete_competitor MCP tool now keep the competitor's shopping products and brand entities, which the background job used to delete, and stop leaving its ads and local businesses without an owner. All four move to the project or to another competitor whose domain they match, or stay unattributed. The job still deletes the competitor's mentions, citations, sentiment and share of voice history.

  21. 2026-10-12 (v1.60.0)

    Model filter exceptions documented. The reference now describes the model filter as each endpoint already applied it. An unknown model, or one the user has not enabled, returns ERR_INVALID_PARAM (422), with these exceptions. GET /sentiments ignores such a value. The citation intelligence endpoints accept only chatgpt, ai_mode, ai_overview, perplexity, gemini, naver_ai and baidu_ai. GET /reports/ai_model_insights/position_distribution accepts those seven even when not enabled. The /metrics endpoints also accept google-ai-mode and google-ai-overview, as ai_mode and ai_overview.

  22. 2026-10-12 (v1.60.0)

    Array form of the model filter refused on dimensions listings. model[] on the /dimensions listings used to be dropped, so they returned unfiltered data. It now returns ERR_INVALID_PARAM (422), as on /metrics and /answers. project_id on GET /dimensions/agent_bots is now documented as required but ignored: the bot catalog is the same for every project.

  23. 2026-10-12 (v1.60.0)

    Brand name in project lists, and the model filter on prompts. GET /dimensions/projects and the list_projects MCP tool now return each project's brand_name (null when it is not set), and so does the project that GET /ping adds when called with project_id, as the published Project schema already declared. GET /dimensions/prompts now applies model, which it used to ignore: it keeps the prompts with at least one execution on that model, of any outcome and date. Its prompt filter already worked and is now documented. The list_prompts MCP tool accepts both filters.

  24. 2026-10-12 (v1.60.0)

    Webhooks with a revoked credential read as disabled. GET /webhooks and the list_webhook_subscriptions MCP tool return disabled: true, instead of false, for a subscription whose API key or OAuth connection was revoked. Such a subscription receives no more events. Delete it, or create it again with the same project, event and URL to replace it with a new subscription and secret.

  25. 2026-10-12 (v1.59.0)

    GET /metrics/prompt_summary rows now carry the brand sentiment of each prompt: sentiment_responses (responses with a sentiment verdict for the brand), the five sentiment_* percentages of that count and net_sentiment, computed like the sentiment metrics of /metrics/timeseries and null when no response has a verdict. They follow breakdown=model and every filter, and cannot be used to sort. Each row also carries the country, language, type, brand focus and tags of its prompt, as in /dimensions/prompts. The get_prompt_summary MCP tool returns the same fields.

  26. 2026-10-12 (v1.58.0)

    Team Members API. Manage the account team through the API with the rules of the Team Members settings page. New GET /team_members and GET /team_invitations list members (account owner first) and pending invitations with their access and projects, POST /team_invitations sends an invitation email, DELETE /team_invitations/:id revokes one and DELETE /team_members/:id removes a member. The MCP tools are list_team_members, list_team_invitations, invite_team_member, revoke_team_invitation and remove_team_member. Reading needs the account owner, a co-owner or the Team Members permission; revoking and removing need the owner or a co-owner. A team member allowed to invite cannot choose the access: the invitation copies their own permissions. Writes require a read_write scope key, and an API key limited to some projects gets ERR_KEY_PROJECT_SCOPED (403) on every Team endpoint. Invitations sent through the API and MCP have a daily limit that counts revoked ones; reaching it answers ERR_LIMIT_REACHED.

  27. 2026-10-12 (v1.58.0)

    GEO Writer version check, stricter traffic windows and webhook re-posts. GEO Writer task payloads return result_version, and PATCH /intelligence_tasks/:id and the MCP tool update_intelligence_task_content accept it as an optional field. If the task was regenerated after you read it, the edit is refused with the new error code ERR_STALE_CONTENT (409), nothing is written and error.meta.result_version holds the current token. Without result_version, edits apply as before. GET /metrics/ai_traffic, GET /metrics/agent_traffic and the MCP tools get_ai_traffic and get_agent_traffic answer ERR_INVALID_PARAM (422) for a range below 1 or a from later than to, instead of an empty result. Re-posting the same project, event and URL to POST /webhooks returns the existing subscription unless the API key or OAuth connection that created it was revoked; then it is replaced by a new subscription with a new secret.

  28. 2026-10-12 (v1.58.0)

    Search Console API additions. New GET /search_console/rows and MCP tool get_search_console_rows group rows by up to three dimensions (for example page and query, or date and page). start_row on queries, pages and rows reads past Google's 25,000-row window, and aggregation_type (auto, byPage, byProperty) works on every Search Console endpoint. REST responses now include data_through; with output=csv, X-Data-Through and X-Truncated carry the same information. MCP upstream errors include retry_after. GET /dimensions/projects/:id and get_project_details report the Search Console connection (search_console.status and property). REST and MCP read the date window the same way: an invalid range is ERR_INVALID_PARAM, and only from after to is ERR_INVALID_RANGE.

  29. 2026-10-10 (v1.57.0)

    Live web analytics (Growth+). New GET /web_analytics/schema and POST /web_analytics/query, with the MCP tools get_web_analytics_schema and query_web_analytics, turn LLM Pulse into a live, read-only bridge to the web analytics provider connected on the AI Traffic page (Google Analytics 4, Adobe Analytics or Customer Journey Analytics, Matomo, PostHog, Plausible or Piano). The caller writes the query in the provider's native format; the connected property is always used, only reads run, rows are capped at 5,000 and identical queries are cached for 10 minutes. New error codes: ERR_WEB_ANALYTICS_NOT_CONNECTED (404), ERR_WEB_ANALYTICS_INVALID_QUERY (422, with the provider's validation message), ERR_WEB_ANALYTICS_ACCESS_REVOKED (403) and ERR_WEB_ANALYTICS_UPSTREAM (503 with Retry-After).

  30. 2026-10-10 (v1.57.0)

    Search Console breakdown truncation flag. GET /search_console/summary and the get_search_console_summary MCP tool now return breakdown_truncated: true when the breakdown left rows out, because of limit or the 25,000-row maximum Google returns. With filters and no dimension, the summary totals are the complete figure Google reports for that filter.

  31. 2026-10-07 (v1.56.0)

    REST and MCP parity. These MCP parameters now refuse undocumented values instead of defaulting (REST is unchanged): sort, sort_dir and breakdown on get_prompt_summary, sort on get_top_sources, group_by and granularity on get_agent_traffic, granularity on get_ai_traffic, and source_type on list_sources, now case-sensitive. get_ai_model_position_distribution accepts naver_ai and baidu_ai. More MCP write tools return the REST error code. Some REST and MCP error messages were reworded; REST codes and HTTP statuses are unchanged. assign_prompt_tags ignores create_missing for team members who cannot create tags, like REST. start_project_draft accepts execute_prompts_immediately. POST /collections and create_collection no longer attach prompts being deleted. PATCH /project_drafts/{id} accepts a nested owned_media object and refuses unknown fields in it.

  32. 2026-10-07 (v1.56.0)

    GEO audits. A new GEO Audits group keeps a technical GEO check on a domain or URL and follows it run after run. GET / POST /geo_audits list audits and create one per audit type, once, weekly or monthly (weekly and monthly for agent_readiness and robots_txt); GET, PATCH and DELETE /geo_audits/{id} read, reschedule, pause or archive one, and creating an archived audit again restores its history. GET / POST /geo_audits/{geo_audit_id}/runs list runs and start a manual run (6 per audit per rolling hour, 200 per account per day), GET /geo_audits/{geo_audit_id}/runs/{sequence} and its /findings return the full result and check-by-check findings, GET /geo_audits/{id}/comparison compares two runs, GET / PATCH /geo_audits/{geo_audit_id}/issues list issues and accept or reopen one (an acceptance lapses when the evidence changes), and GET /geo_alerts lists the alerts audits raised. Active recurring audits are capped per plan and over the cap return ERR_LIMIT_REACHED, as do the run limits. New MCP tools mirror every endpoint: list_geo_audits, get_geo_audit, create_geo_audit, update_geo_audit, delete_geo_audit, compare_geo_audit_runs, list_geo_audit_runs, run_geo_audit, get_geo_audit_run, list_geo_audit_findings, list_geo_audit_issues, update_geo_audit_issue and list_geo_alerts. Writes need a key with write scope and, for team members, the matching permission on GEO Optimization.

  33. 2026-10-04 (v1.55.0)

    Project-scoped API keys. An API key can now be limited to one or several projects when it is created, with the Projects field on the API keys page. The set cannot be changed later, and existing keys keep seeing the whole account. A key limited to some projects sees only those: GET /dimensions/projects and the MCP tool list_projects return only them, any other project id, domain or name answers ERR_PROJECT_NOT_FOUND exactly like a project that does not exist, and webhook subscriptions and studies list only theirs. GET /account and get_account_usage list the projects in the new api_key_project_ids field. Creating a project and the project draft wizard answer the new ERR_KEY_PROJECT_SCOPED (403), and their MCP tools are left out of tools/list. Deleting a project removes it from the keys limited to it, and a key left with no project is revoked.

  34. 2026-10-04 (v1.54.0)

    Store integrations. A new Store Integrations group powers the LLM Pulse app for Shopify: GET /store_connection matches a store domain to a project, PUT /ai_orders and GET /ai_orders store and read back the orders AI assistants referred to the store, and GET / POST /catalog_prompt_suggestions with /accept and /reject turn catalog products into buyer prompts to track. The MCP tool get_ai_orders reads the stored orders. POST /intelligence_tasks also accepts task_type=product_listing with a product object and returns ready-to-apply product page copy; that type is API-only. GET /dimensions/shopping product rows now include best_rank, models and last_seen_at. New error codes: ERR_INTEGRATION_UNAVAILABLE (403, accounts with a white-label portal or an embed) and ERR_GENERATION_FAILED (502, retry the request).

  35. 2026-10-03 (v1.53.0)

    Local businesses. New endpoint GET /dimensions/local_businesses and MCP tool list_local_businesses list the shops, restaurants and services AI answers name for your prompts, one row per business at its address, with appearances, prompts, average rating, average position, review count and whether it is yours or a tracked competitor, plus a totals block. Both accept the standard listing filters, owned, query, order and direction, and the endpoint supports output=flat and output=csv. Available on every plan; team members need read access to Local Businesses.

  36. 2026-10

    Google entity links grouped apart. Links from Google AI Mode and AI Overviews to Google's entity viewer (google.com/searchviewer/...) keep their url but now report google-entity.invalid as their domain and host instead of google.com, in GET /metrics/top_sources, GET /dimensions/sources, the citation intelligence endpoints and the exports. They never count as owned or competitor citations, so a project or competitor on a Google domain is no longer credited for them. The app labels the group "Google (entity)".

  37. 2026-09-30

    API keys stop working below Scale. API keys are a Scale feature, and they now stop working while the account is below the Scale plan, for example after a downgrade: every REST request and every /mcp request made with a key answers ERR_PLAN_REQUIRED (403). Keys are not revoked: they stay listed, can still be revoked, and work again once the account is back on Scale or above. MCP over OAuth is not affected.

  38. 2026-09-29 (v1.52.0)

    Edit llms.txt report files through the API. PATCH /technical_geo_reports/:id/content replaces the llms.txt and llms-full.txt files of a completed llms.txt report: send report_type=llms_txt, an edits object with the full new text of llms_txt and/or llms_full_txt, and the content_version you last read. The report detail now returns result_data.content_version. A stale or missing content_version, a blank file, a file over 200,000 characters or a report that has not completed returns ERR_INVALID_PARAM, and the update response adds changed_files. The first edit keeps the generated files in original_llms_txt_content and original_llms_full_txt_content, and POST /technical_geo_reports/:id/revert_content restores them. Two MCP tools mirror the endpoints: update_technical_geo_report_content and revert_technical_geo_report_content. Both writes need a key with write scope and, for team members, create permission on GEO Optimization.

  39. 2026-09-29 (v1.52.0)

    Automatic output language for llms.txt reports. output_language_code on POST /technical_geo_reports and create_technical_geo_report also accepts auto, which keeps the llms.txt files in the website's own language. The create response echoes auto, and the report then returns output_language_code: null.

  40. 2026-09-28 (v1.51.1)

    Technical GEO report quota. POST /technical_geo_reports and create_technical_geo_report now count each successfully created report as one daily unit. Run all attempts to create nine reports and starts only when at least nine daily units remain. Reports that are not created use no unit. Daily allocations vary by account.

  41. 2026-09-28 (v1.51.0)

    Response schemas match what the API sends. Responses are unchanged on the wire; the OpenAPI document and the official SDKs now describe them correctly. The points of GET /metrics/timeseries, GET /metrics/summary and the over_time series of GET /metrics/sov (TimeseriesPoint) carry a calendar date such as 2026-09-01 (the first day of the bucket for week and month granularity), not a timestamp, and value is null for rate, position and sentiment metrics on days without answers. The Go, Java, Kotlin, Rust and C# SDKs could not decode these points before. In the typed SDKs date is now a date type, for example LocalDate in Java and Kotlin, DateOnly in C#, NaiveDate in Rust, date in Python and a string in Go. Fields the API can send as null are now declared nullable, which the C# SDK rejected before: brand_name, url, description, business_model, target_audience, brand_voice, goals, google_play_id and app_store_id on GET /dimensions/projects/{id}; matching_names, google_play_id, app_store_id and color on GET /dimensions/competitors/{id}; domain on the project actor in GET /metrics/timeseries, GET /metrics/summary and GET /metrics/sov, and on the own-brand row of GET /dimensions/competitors, when the project has no URL; response, executed_at, success, duration_ms and fan_out_queries on GET /answers/{id}; result_data on GEO Writer tasks; and last_delivered_at on webhook subscriptions. duration_ms is a number with one decimal place, not an integer. In the Go SDK the non-array fields among them now use the Nullable* wrapper types.

  42. 2026-09-28 (v1.50.1)

    Sentiment access parity. GET /sentiments and GET /dimensions/sentiments now enforce the Growth plan requirement. The matching MCP tools use the same Growth gate and return ERR_PLAN_REQUIRED to direct calls below that tier.

  43. 2026-09-28 (v1.50.0)

    Project setup in fewer calls. POST /projects and the create_project MCP tool accept collections, a list of {name, prompts} that creates prompt tags with the project and tags prompts of the same request by their text, and the response adds collections and same_domain_projects (projects you can already see on the same domain; the create is never blocked). industry accepts one key or an array on create, draft and update, and an unknown key now lists the valid ones. PATCH /projects/:id and update_project accept name. GET /metrics/sov periods add confidence and margin_of_error, plus a top-level sample. GET /account and get_account_usage add plan_name. MCP only: get_sov takes view=compact and list_prompts takes fields.

  44. 2026-09

    Plan-required code on gated MCP tools. A direct tools/call to a tool your plan does not include now returns code: "ERR_PLAN_REQUIRED" next to error, the same code the REST endpoints return for a plan gate. The error text is unchanged.

  45. 2026-09 (v1.49.0)

    Page mentions are read per project. The page mention fields of GET /citation_intelligence/groups, GET /citation_intelligence/urls/{url_sha256} and /content, including the domain and host mention counts and the content_gap filter, now describe the cited page's analysis for the requesting project. A page not yet analyzed for the project, including one saved before the project cited it, returns null for brand_mentioned and competitor_mentioned instead of false, content_gap_status: mentions_not_processed and page_cache.mentions_processed: false, and a group's mention counts are null when none of its pages has been analyzed. The same rule applies to page_details in GET /answers/{id}, to mention_filter on GET /dimensions/sources and to the matching MCP tools. mentions_not_processed was already returned before this release and is now documented.

  46. 2026-09 (v1.48.0)

    Links into the app. Answers (GET /answers, GET /answers/{id}, GET /dimensions/prompt_executions), prompts (GET /dimensions/prompts, GET /metrics/prompt_summary) and technical GEO reports (GET /technical_geo_reports, GET /technical_geo_reports/{id}) now return app_url, the link that opens the record in the app. POST /technical_geo_reports returns app_urls, one link per created report, keyed by report type. Each link ends in ?project_id=, so it opens that project for any user with access to it. The MCP tools return the same links.

  47. 2026-09 (v1.47.0)

    llms.txt output language and manual edits. POST /technical_geo_reports and the create_technical_geo_report MCP tool accept output_language_code (ISO 639-1, defaults to the project language) for the llms.txt report of the bundle. Report summaries expose output_language_code, and a completed llms.txt result_data adds manually_edited_at, original_llms_txt_content, original_llms_full_txt_content and metadata.output_language_code: when the files were edited in the app, llms_txt_content and llms_full_txt_content return the edited text.

  48. 2026-09 (v1.46.0)

    Search Console filters is now callable from the official SDKs. The parameter accepts the whole list as one JSON value, filters=[{"dimension":"page","operator":"contains","expression":"/blog/"}], because an array of objects has no query-parameter form that a generated client can produce. The existing bracket encoding, filters[][dimension]=page, is unchanged and keeps working.

  49. 2026-09 (v1.45.0)

    Model filters now accept naver_ai and baidu_ai for accounts with those self-serve add-ons enabled.

  50. 2026-09

    MCP directory compatibility. Tool descriptions now state only their own operation, inputs, limits, and side effects. Cross-tool orchestration and model-behavior instructions were removed. Guided-analysis playbooks remain available through the user-invoked MCP prompts feature, but are no longer exposed through get_analysis_playbook because tools must not dynamically inject behavioral instructions.

  51. 2026-09 (v1.44.0)

    Cited URLs keep their citation metrics when page content is unavailable. Unknown page mentions now return null; content_gap_status includes content_unavailable. Empty crawl results no longer appear as analysed pages. Observed 404 and 410 statuses remain visible.

  52. 2026-09

    Machine-readable codes on MCP tool errors. A failing tools/call keeps isError: true, and its text now carries code next to error whenever the state has a REST counterpart, with the same value the REST endpoint returns: ERR_PROJECT_NOT_FOUND, ERR_INVALID_PARAM, ERR_INVALID_RANGE, the three Search Console codes (ERR_SEARCH_CONSOLE_NOT_CONNECTED, ERR_SEARCH_CONSOLE_ACCESS_REVOKED, ERR_SEARCH_CONSOLE_UPSTREAM) and ERR_AI_TRAFFIC_NOT_CONNECTED / ERR_AGENT_TRAFFIC_NOT_CONNECTED. The error text is unchanged.

  53. 2026-09

    Webhook for manual GEO Writer edits (v1.43.0). A new event type, intelligence_task.updated, fires when the text of a completed task is edited by hand or reverted to the AI version. Both GEO Writer event payloads now carry manually_edited_at, which is null on a task nobody has edited and on a task that was just reverted. Subscribe to it with POST /webhooks like any other event, and GET /webhooks/sample/intelligence_task.updated returns example payloads. The Zapier, Make and n8n connectors expose it as a new trigger.

  54. 2026-09

    Edit GEO Writer output after generation (v1.42.0). PATCH /intelligence_tasks/:id edits the text of a completed task in place: send an edits object whose keys are dotted paths into result_data (for example sections.0.content or title) and whose values are the replacement text. Only string fields that already exist can change; a path that does not resolve, a blank title or a value over 20,000 characters returns ERR_INVALID_PARAM. The first edit keeps a copy of the generated output, and POST /intelligence_tasks/:id/revert restores it. Task payloads gain manually_edited_at (list and detail) and edited_by_user_id (detail), and the update response adds changed_paths. Two MCP tools mirror the endpoints: update_intelligence_task_content and revert_intelligence_task_content. Both writes need a key with write scope and, for team members, edit permission on GEO Writer.

  55. 2026-09

    Citing-domain mention share prompt filters (v1.42.0). GET /citation_intelligence/mentions_by_domain and the get_mentions_by_citing_domain MCP tool now accept brand_kind (brand, brand_other, or non_brand) and apply it to the project-scoped response universe together with model, country, language and collection filters. Omitting it preserves the previous all-brand-kinds behavior. The REST endpoint rejects invalid values with ERR_INVALID_PARAM; the MCP tool returns a validation error.

  56. 2026-09

    Two Search Console corrections (v1.41.0). An unknown dimension now returns ERR_INVALID_PARAM instead of being silently dropped, and page and query breakdown values keep the casing Google returns rather than being lowercased, because a page URL is case sensitive.

  57. 2026-09

    Search Console endpoints now speak the full Google query vocabulary (v1.41.0). The four /search_console/* endpoints and their MCP tools take three new parameters from the Search Analytics query Google exposes: search_type (web, image, video, news, discover, googleNews), filters (an array of {dimension, operator, expression} objects combined with AND, two of the six operators being RE2 regex) and data_state (final by default, or all to include the most recent still incomplete days). GET /search_console/summary now breaks down by page, query and searchAppearance as well as country and device, capped by limit (default and maximum 1000). Date windows widen from 400 to 487 days, the 16 month retention Google applies.

  58. 2026-09

    Date windows and aggregation corrections (v1.40.0). A date-only to (for example to=2026-09-01) now covers that whole day. It previously resolved to midnight, so the final day was excluded and every window was one day short. Clients that already send a full timestamp are unaffected. Weekly and monthly buckets on GET /reports/ai_model_insights/* now divide the bucket total instead of averaging the daily percentages, so a busy day no longer counts the same as a quiet one. Position averages weight each row by how many positions it holds rather than treating every row alike. Rows removed from a project no longer count towards mentions, citations, sources or sentiments on any read endpoint.

  59. 2026-09

    Currency on shopping rows. GET /dimensions/shopping with view=merchants now returns a currency field naming the money min_price, max_price and avg_price are expressed in. Providers price each market in its own currency and send no currency field of their own, so a merchant selling in more than one now reports the currency most of its prices use instead of averaging across them, and a range never mixes two kinds of money. It is null when no price carried a currency we could resolve. On view=products, currency now names the money max_price is expressed in, and a new currency_count field says how many currencies that product was priced in: above 1 means the row reports its highest-priced listing and min_price may be another currency. totals.avg_price is now computed inside one currency instead of averaging across them, and totals.avg_price_currency names it. No new endpoints or error codes.

  60. 2026-09

    Clearer error details and a stricter answers model filter (v1.38.0). Errors with details under error.meta.message now include those details in error.message too. error.meta is unchanged. Errors without details still use default message tokens, such as missing_authorization. Branch on error.code, never on the message text. GET /answers now rejects a model value the account does not track with 422 ERR_INVALID_PARAM instead of ignoring the filter. The ERR_LIMIT_REACHED and ERR_QUOTA_EXCEEDED descriptions now list every cap each one covers.

  61. 2026-09

    Revoked keys and write-scope responses (v1.37.1). A revoked API key now answers 403 ERR_REVOKED_API_KEY, as documented, instead of 401 ERR_INVALID_API_KEY. A team member's key is refused the same way while the account owner is blocked or pending deletion. POST /intelligence_tasks, PATCH /project_drafts/:id and POST /project_drafts/:id/finalize now document the 403 ERR_INSUFFICIENT_SCOPE response a read-only key receives, matching the other write operations.

  62. 2026-09

    Search Console error codes and live-read contract (v1.37.0). When live reads are enabled, the four /search_console/* endpoints return ERR_SEARCH_CONSOLE_ACCESS_REVOKED (403) for revoked Google access; reconnect the property in Preferences > Project Settings > Data Connections. They return ERR_SEARCH_CONSOLE_UPSTREAM (503) when Google Search Console is unavailable or over quota; wait for the number of seconds in Retry-After before retrying. MCP tools report these conditions as tool errors. The X-Search-Console-Backend response header identifies stored or live reads. Stored reads use synced data without contacting Google. For queries and pages, total counts distinct keys available for the range: keys from synced daily rows for stored reads, or up to 25,000 rows from one Google request for live reads. Live responses include truncated: true when that limit is reached. Sorting and pagination apply to the available set.

  63. 2026-09

    Per-competitor citation URL matching (v1.36.0). POST /competitors and PATCH /competitors/:id now accept the optional citation_match_mode field with domain, host or path_prefix. citation_match_path is required when using path_prefix. PATCH /competitors/:id can also change domain, which stores the website domain or exact host used by the rule. Competitor read payloads return the rule fields. Changing the website or either rule setting reclassifies historical citations in the background, so historical metrics and source attribution follow the new setup.

  64. 2026-08 (late)

    Public API reference split into one page per resource. https://llmpulse.ai/api-docs now covers getting started (keys, first call, account usage) and links to a page per resource: /api-docs/projects, /api-docs/metrics, /api-docs/prompts, /api-docs/webhooks, /api-docs/core-concepts (shared filters, output formats, error codes), /api-docs/integrations (snippets, Postman, MCP), /api-docs/oauth and the rest, each reachable from every other page. Old deep links such as /api-docs#webhooks are forwarded to the page that now holds the section. llms.txt lists the documentation URL for each resource group alongside its endpoints. Signed-in Scale+ users still get the complete reference on one page, with the live playground, in the app under API Keys. No endpoint, parameter, payload or error code changed.

  65. 2026-08 (late)

    Project profile enums refreshed (v1.35.0). business_model now describes one thing, how a brand sells, instead of mixing channel with sector. The accepted keys are B2B_SAAS, B2C_SUBSCRIPTION, ECOMMERCE, RETAIL, MARKETPLACE, LEAD_GENERATION, SERVICES, ENTERPRISE_SOFTWARE, MEDIA_ADVERTISING, EDUCATION_TRAINING, NONPROFIT_PUBLIC and OTHER. Retired keys (B2B_CLOUD_SERVICES, B2C_SMART_HOME, B2C_STREAMING, B2C_GAMING) are mapped forward to their closest current value on POST /projects and PATCH /projects/:id rather than rejected, so existing integrations keep working; genuinely unknown keys still return ERR_INVALID_PARAM. industry now accepts 34 keys instead of 19, adding sectors that previously had to settle for OTHER. Stored values were migrated, so a project created before this change reports its new key when you read it back. The free-text companion business_model_other is now part of the API: send it alongside business_model: OTHER on POST /projects or PATCH /projects/:id (and the create_project / update_project MCP tools) and it comes back in the project payload. Against any other key it returns ERR_INVALID_PARAM, and it is cleared automatically when the business model moves away from OTHER.

  66. 2026-08 (late)

    Multi-value analytics filters (v1.34.0). collection_id, country_code, language_code and prompt_type now accept one value or a comma-separated list on metrics, dimensions, answers, citation intelligence and AI Model Insights endpoints that already support those filters. GET /sentiments also accepts several analysis values. Values inside one filter are combined with OR, while different filters are combined with AND. Single-value requests continue to work unchanged, and matching MCP tools use the same contract.

  67. 2026-08 (late)

    Technical GEO report retrieval (v1.33.0). GET /technical_geo_reports lists reports by project_id and report_type, while GET /technical_geo_reports/:id returns the current status and full result_data when completed. New MCP tools list_technical_geo_reports and get_technical_geo_report provide the same access, and create_technical_geo_report now returns report ids and tells clients to poll them. Claude and other MCP clients can now run, wait for and read Technical GEO reports in the same chat, with no copy and paste step.

  68. 2026-08 (late)

    Sentinel non-answers exposed as no_result. When a provider returns nothing for a prompt after all retries, the stored text is a placeholder rather than a real AI response; those rows were already excluded from every platform metric but were indistinguishable via the API. GET /answers items and GET /answers/:id now carry a no_result boolean, and GET /answers (plus the MCP list_answers tool) accepts an optional no_result filter: false = only real answers (recommended when computing your own metrics), true = only sentinels, omitted = both (unchanged legacy shape).

  69. 2026-08 (mid)

    Project profile updates and Brand Book on create (v1.31.0). New endpoint PATCH /api/v1/projects/:id updates a project's profile after creation, the same fields as Project Settings: brand_name, description, industry, business_model, target_audience, brand_voice, goals, primary_products and matching_names. The Brand Book fields (description, industry, brand_voice, target_audience) feed GEO Writer, prompt suggestions and Recommendations, so external systems can keep brand context in sync programmatically. Send only the fields to change; unknown fields return ERR_INVALID_PARAM. Changing matching_names (a full replacement list) re-runs mention/citation matching over the project history in the background (rematching: true; further edits are rejected while it runs), and a brand_name change applies to future runs only. POST /api/v1/projects (and the create_project MCP tool) now accept business_model, target_audience, brand_voice, goals and primary_products at creation time. The existing MCP tool update_project and the new REST endpoint now share the exact same service. Requires a read_write key; team members need the Projects update permission.

  70. 2026-08 (mid)

    Filter corrections on the new listings (v1.30.0). Filters that were documented but silently ignored now work. store (owned media) and status (Reddit threads) reach the query instead of being dropped, so store=app_store and status=archived stop returning unfiltered rows. owned=true applies to GET /dimensions/shopping?view=merchants, which previously returned every merchant including competitors, and to GET /dimensions/owned_media?provider=mobile_apps, whose rows now carry the yours flag every other provider already returned. On that same provider, total is now the full ranking count (capped at 500) rather than the size of the page, which had told paginating clients there was nothing after page 1. direction=desc now applies to the text sorts of GET /dimensions/query_fan_outs (order=query_text, order=prompt_text), which always answered ascending; both now default to descending like every other sort. An endpoint's own view parameter can finally be combined with output=flat or output=csv (for example ?view=merchants&output=csv), which returned ERR_INVALID_PARAM, and flat responses echo view, provider and store back. GET /account now reports the rate limit of the key you called with instead of the default, and its subscription block is limited to callers who can access Billing and Plans. Studies are scoped to the projects the caller can reach.

  71. 2026-08 (mid)

    Six new product surfaces (v1.29.0). Shopping and paid placements inside AI answers: GET /api/v1/dimensions/shopping and GET /api/v1/dimensions/ads (Scale+). Owned media and communities: GET /api/v1/dimensions/owned_media (YouTube, Instagram, Facebook, TikTok, LinkedIn, app stores) and GET /api/v1/dimensions/reddit (Growth+). Multi-model analyst reports: GET /api/v1/reputation/reports, GET /api/v1/reputation/reports/:id, GET /api/v1/studies, GET /api/v1/studies/:id and GET /api/v1/studies/:id/reports/:report_id (requires reputation monitoring). The shopping and ads paths are deliberately model-agnostic rather than named after one assistant, since the underlying data has always carried the standard model enum. Nine matching MCP tools: list_shopping_products, list_ads, list_reddit_citations, list_owned_media, list_reputation_reports, get_reputation_report, list_studies, get_study, get_study_report. All nine endpoints support output=flat and output=csv.

  72. 2026-08

    Query fan-out in the API and MCP (v1.28.0). New endpoint GET /api/v1/dimensions/query_fan_outs exposes the sub-queries a model actually issued when answering your tracked prompts, which is often not the phrasing you wrote. view=query (the default) returns one row per distinct sub-query with its occurrence count and share; view=prompt returns one row per prompt with how many distinct sub-queries it produced. It accepts the standard prompt filters plus query (substring search), order, direction and output for flat/CSV, and an order that does not belong to the chosen view returns ERR_INVALID_PARAM. The matching MCP tool is list_query_fan_outs. Fan-out is reported mainly by ChatGPT, so an empty result usually means the models in scope do not expose it rather than that nothing was searched. The endpoint returns the aggregation only: for a period-over-period delta, call it twice with explicit from/to. Both surfaces are gated by the same Query Fan-Out team-member permission as the in-app page.

  73. 2026-08

    Account usage, rate-limit headers and an MCP glossary (v1.27.0). New endpoint GET /api/v1/account returns the plan, tracking cadence, subscription window, quota consumption (prompts, projects, competitors per project, monthly GEO Writer tasks, team members) and the rate limits that apply to your key, so an integration can see its remaining budget instead of discovering the ceiling by hitting it. An unlimited quota returns limit and remaining as null with unlimited: true. Limits resolve through the account owner, so a team member sees the capacity that applies to them. The matching MCP tool is get_account_usage, available on every plan. Every /api/v1 response now carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (the 429 ERR_RATE_LIMITED response carries them alongside Retry-After), and the two budgets, 300 requests/minute globally and 60/minute for writes, are now documented rather than implicit. The MCP server also exposes a new resource llmpulse://glossary defining every metric, unit, dimension and reading caveat (visibility vs AI Visibility Score, share of voice denominators, brand focus, partial periods, small samples), so an assistant can read the definitions instead of inferring them. No existing endpoint, parameter, payload or error code changed.

  74. 2026-08

    Agent Readiness joins the technical GEO bundle (v1.26.0). POST /technical_geo_reports now also creates an agent_readiness report scoring how ready the domain is for AI agents, so created_reports and report_ids include the new agent_readiness key (9 reports per run instead of 8). The MCP tool create_technical_geo_report creates the same bundle. Existing keys and response shapes are unchanged.

  75. 2026-08

    Grok and DeepSeek weekly tracking. The model filter values grok and deepseek now return real weekly visibility data on accounts with those add-ons enabled, across every metrics, dimensions, answers, sentiments and citations endpoint (they were previously accepted as filter values but never matched any executions). Grok answers come from its native web search, so they carry sources and citations like every other model. DeepSeek answers carry no sources or citations: DeepSeek offers no web search, so its answers reflect the model's own knowledge. DeepSeek rows return citations: 0 and an empty source list by design; visibility, mention_rate, share of voice and sentiment behave normally. Response shapes are unchanged, and models an API key's user has not enabled are still silently dropped.

  76. 2026-08

    Public MCP server card. New endpoint GET /api/v1/mcp/server-card returns a Model Context Protocol Server Card describing the endpoint, its streamable HTTP transport, the protocol versions it accepts and the Authorization header a client must send. It needs no authentication, because it is the document a client reads before it holds a credential, and it contains no credential itself. The card is advertised in the Agentic Resource Discovery catalog at /.well-known/ai-catalog.json, whose MCP entry now uses the correct application/mcp-server-card+json media type and points at the card rather than at the transport endpoint. The card is deliberately NOT served at /.well-known/mcp/server-card.json: the MCP specification rules out that location. LLM Pulse also now publishes an API catalog at /.well-known/api-catalog (RFC 9727) and an agent skills index at /.well-known/agent-skills/index.json.

  77. 2026-08

    API reference reorganized by resource. The docs at /api-docs, the OpenAPI and Swagger specs, the machine-readable llms.txt index and the Postman collection now group every endpoint under the resource it belongs to (Projects, Metrics, Competitors, Prompts, Collections & Tags, Answers, Mentions & Citations, Sentiments, Sources & Citation Intelligence, AI Model Insights, AI & Agent Traffic, Search Console, Recommendations, GEO Writer, Technical GEO Reports, Annotations, Webhooks, MCP), each showing its reads and writes together and in the same order on every surface. The OpenAPI tag list now declares every tag in use: Projects, Competitors, Collections, Annotations, Reports and OAuth were missing, so Swagger UI and Redoc listed those endpoints last with no description. POST /projects and the /project_drafts wizard, previously absent from llms.txt, are now listed, and the Postman collection covers every endpoint instead of the original two folders. No endpoint, parameter, payload or error code changed.

  78. 2026-08

    Amazon Rufus is now Alexa for Shopping. Amazon renamed its shopping assistant, so the model is labelled Alexa for Shopping across the app, the website and the docs. Nothing changes for integrations: the API value stays amazon_rufus on the model filter and in every response, and historical data is untouched. No action required.

  79. 2026-08

    Native Rust CLI and official SDKs. CLI v2 replaces the JavaScript implementation with native binaries for macOS, Linux and Windows while preserving the existing configuration and profile format. Typed commands cover all 71 REST operations, with JSON, table and CSV output plus a direct REST command. Official generated clients are now maintained for TypeScript, Python, Go, Java, Kotlin, C#, PHP, Ruby, Rust, Swift, Dart and R. The OpenAPI document uses OpenAPI 3.0-compatible nullable fields so every client can be generated with the same pinned toolchain.

  80. 2026-08

    Automatic annotations and all-plan access (v1.23.0). Annotations are now available on every plan, including Starter and trial accounts. Rows returned by GET /annotations and the MCP list_annotations tool include origin: manual, automation, geo_test, or platform. Automatic project annotations record daily prompt-set changes, enabled AI model changes, and tracking frequency changes. Existing fields and write behavior are unchanged.

  81. 2026-08

    Share of Voice sample sizes and per-model grouping (v1.22.0). GET /metrics/sov now returns a periods array with, per bucket, the total mentions the shares were computed on (the sample size: a bucket with 1-3 mentions reads as 100/50/33.33 and should be treated as low-sample) and a partial flag marking buckets still collecting data or clipped by the requested window. Each current row also carries precomputed deltas: previous_share (last complete bucket) and avg_share (mean over complete buckets with data; partial buckets excluded). Existing fields are unchanged. The MCP get_sov tool gains group_by=model returning one compact per-model share comparison per call (add include_series=true for per-model trend series), every project-scoped MCP tool now accepts the project domain or exact name/brand name in project_id besides the numeric id, MCP metric responses include an app_url source link, and MCP metric tools render interactive widgets in hosts that support them: share-of-voice donut, visibility summary card, metric-over-time line chart (get_timeseries) and top cited domains (get_top_sources).

  82. 2026-07 (late)

    Project creation response correction (v1.21.1). POST /projects and POST /project_drafts/:id/finalize now return competitors.processing: false because competitor setup finishes inside the project transaction. Earlier responses incorrectly reported true. Project website URLs now return ERR_INVALID_PARAM for credentials, private or special IP addresses, localhost and internal hostnames. Public DNS hostnames, internationalized domain names and public IP literals remain supported. A malformed JSON body sent to a write endpoint now returns the JSON parse error (the ERR_INVALID_PARAM family) instead of ERR_PROJECT_NOT_FOUND.

  83. 2026-07 (late)

    Mention and citation filters (v1.21.0). GET /answers, GET /dimensions/prompt_executions and GET /dimensions/sources accept mention_filter and (on the first two) citation_filter, the same two-axis matrix the Responses and Citations pages expose: your brand crossed with competitors, each axis present, absent or any. Presets are mentions_you, not_mentions_you, mentions_competitor, not_mentions_competitor, you_and_competitor, competitor_not_you, you_not_competitor and no_brands (no tracked brand appears at all), with the citation variants cites_you, not_cites_you, cites_competitor, not_cites_competitor and cites_no_brands. Pair either with competitors to narrow the competitor side to specific rivals; on a negative preset that reads "none of these". On /dimensions/sources the filter applies to the crawled content of each cited page. Unknown presets return ERR_INVALID_PARAM. The same arguments are available on the MCP tools list_answers, list_prompt_executions and list_sources.

  84. 2026-07 (late)

    Flat and CSV output for BI tools (v1.20.0). Read endpoints now accept an optional output parameter: output=flat returns the same metadata plus rectangular columns and rows, and output=csv returns those rows as text/csv. This lets Tableau (through its REST API Connector), Excel, Google Sheets and warehouse loaders read the API without code that walks the nested JSON. /metrics/sov also accepts view=over_time|current|breakdown. Omitting output returns the exact response existing integrations already receive. Errors are always JSON, percentages stay on the 0-100 scale, paginated endpoints expose X-Total-Count, X-Page and X-Per-Page headers, and flat output is capped at 200,000 rows.

  85. 2026-07 (late)

    Longer metric history windows. The maximum date window on the metrics endpoints (/metrics/*), the /dimensions/* listings, citation intelligence and AI model insights (REST and their MCP tool twins) is raised from 400 to 1500 days, enabling all-time queries. Search Console endpoints keep their 400-day window, which matches the GSC data retention we store. The Looker Studio connector gains "Last 365 days", "All time" and "Follow report date range" options plus three new report types (Prompt performance, Share of Voice, Top Sources) built on these endpoints.

  86. 2026-07 (late)

    Write API expansion: launch, update, delete (v1.19.0). Recommendations can now be launched via the API: POST /recommendations (MCP launch_recommendations) starts an async generation and returns the run to poll; the MCP tool no longer requires the in-app chat confirmation card (external clients launch directly, the in-app chat agent still asks for confirmation). New management endpoints, each with an MCP twin: DELETE /prompts/:id, PATCH/DELETE /competitors/:id, PATCH/DELETE /collections/:id, and a full annotations set (GET /annotations, PATCH/DELETE /annotations/:id, Growth+). Deletes are irreversible: rows disappear immediately and historical data is purged in the background. All write endpoints require a read_write API key and respect the team-member permission matrix.

  87. 2026-07

    MCP quality pass (from an external agent audit). Unknown model values and reversed from/to windows now return ERR_INVALID_PARAM instead of being silently ignored. GET /metrics/agent_traffic returns the new ERR_AGENT_TRAFFIC_NOT_CONNECTED when no agent-traffic source is connected. GET /metrics/top_sources avg_visibility is now the percentage of responses citing the domain (bounded 0-100). duration_ms fields are now real milliseconds. Additive fields: url_sha256 + created_at on source rows, matching_names on competitor list rows, score on sentiment categories, created_at on created annotations, data_through on Search Console responses (GSC publishes with a 2-3 day lag). MCP tools: list tools accept range, list_answers truncates responses to 1,500 chars by default (full_text=true for more), list_citation_groups url view is compact unless include_page_details=true, cited-URL tools accept a raw url alternative to url_sha256, get_sov defaults to all configured competitors, list_prompts gains a query search param, and not-found errors echo the requested id.

  88. 2026-07 (late)

    Lapsed subscriptions lose API access. When a self-serve subscription (Starter, Growth or Scale) is cancelled and its paid-through date has passed (after a short grace period), that account's API keys return 403 ERR_ACCOUNT_INACTIVE. Active subscriptions are unaffected, and so are invoice-paid and negotiated plans (Scale+ custom, Partner, Enterprise), which keep working while their billing is handled manually. Re-subscribe from the billing page to restore access. New error code: ERR_ACCOUNT_INACTIVE (403).

  89. 2026-07 (late)

    Top Sources visibility corrected. avg_visibility (and its avg_mention_rate alias) in GET /metrics/top_sources is now the share of valid responses that cite the domain: distinct citing responses divided by every valid response in the period. It previously counted source rows, so a response citing a domain three times counted three times, and divided only by the responses that had any source, which could report values above 100%. Expect lower, correct percentages. total_responses is unchanged.

  90. 2026-07 (late)

    Amazon Rufus model (v1.18.0). New AI model amazon_rufus (Amazon's shopping AI assistant, at the time called Amazon Rufus and since renamed Alexa for Shopping) launched as an Enterprise add-on and is now a paid add-on on every plan. The model filter on metrics, dimensions, answers and sentiments endpoints accepts amazon_rufus. As with other add-on models, data only appears for accounts where the model is enabled.

  91. 2026-07 (late)

    Project draft wizard API (v1.17.0). Multi-step project creation with AI suggestions: POST /project_drafts starts a draft and suggests name/description/industry for the URL, PATCH /project_drafts/:id submits each step (details, prompts, competitors, owned media) under strict forward gating and returns suggestions for the next step, GET reads state (cache-only suggestions for safe polling), and POST .../finalize creates the project with the exact fast-mode effects, idempotently. New error codes ERR_DRAFT_NOT_FOUND and ERR_DRAFT_STATE. Drafts expire after 24 hours. Five MCP tool twins ship alongside: create_project, start_project_draft, get_project_draft, update_project_draft and finalize_project_draft, sharing the exact REST services.

  92. 2026-07 (late)

    Project creation API (v1.16.0). New POST /projects creates a complete project in one call (fast mode): project fields, prompts (queued for immediate execution and categorization), competitors, weekly email subscription. Idempotent replays via external_identifier (embed-enabled accounts) return the existing project with idempotent: true. Optional execute_prompts_immediately: false defers the first run to the next scheduled tracking window. Plan gates and quotas are enforced exactly like the in-app wizard (ERR_LIMIT_REACHED, ERR_QUOTA_EXCEEDED, ERR_PLAN_REQUIRED).

  93. 2026-07 (late)

    MCP usage guidance + richer project details (v1.15.6). The MCP server now returns usage instructions to connected AI clients on initialize: the recommended workflow, metric naming, efficiency tips, and the brand_kind=non_brand rule for fair brand-vs-competitor comparisons (matching the in-app Overview default). brand_kind and prompt_type filters added to all three GET /reports/ai_model_insights/* endpoints and their MCP tools (get_ai_model_summary, get_ai_model_position_distribution, get_ai_overview_results); invalid values return ERR_INVALID_PARAM. GET /dimensions/projects/:id (and the get_project_details MCP tool) now include stats.prompts_by_brand_kind plus a data_coverage block listing the models, countries and languages that actually have data, so one call replaces separate models/locales lookups.

  94. 2026-07 (mid)

    Citation metric consistency (v1.15.4). Citations and Citation Rate now include visible citations and background source references across Overview, AI Model Insights, REST and MCP. Background citations have no visible rank and remain excluded from avg_position and position distributions. Source ownership now honors exact-subdomain matching consistently. By Domain remains a registrable-domain rollup. Response shapes are unchanged.

  95. 2026-07 (mid)

    MCP Streamable HTTP notifications now return an empty 202 response. Strict clients such as Claude and Codex can complete initialization instead of failing when they parse a JSON null response.

  96. 2026-07 (mid)

    MCP OAuth connections now expire after one year. Access and refresh credentials share one fixed authorization deadline. Refresh responses return the same reusable refresh token to avoid credential loss and concurrency failures in MCP clients.

  97. 2026-07 (mid)

    REST and MCP unified on one shared query layer. The metrics endpoints (/metrics/timeseries, summary, sov, prompt_summary, top_sources, agent_traffic, ai_traffic) and every /dimensions/* listing now execute the same query code as their MCP tool twins, so both surfaces always return identical data. MCP tools gained the filters they were missing: prompt_type / brand_kind on get_prompt_summary, get_top_sources and the listing tools, plus source_type on list_sources (whose rows now include source_type and app-store link flags like REST). MCP input validation now matches REST: unknown collection_id / prompt ids, malformed dates and date windows above 400 days return errors instead of being silently ignored. list_prompts rows now include collection_ids, and REST summary rows now include the metric field MCP already returned. One intentional difference remains: in week/month granularity, MCP leaves periods before the first data point null for rate and position metrics so averages are not dragged down, while REST keeps backfilling 0.0.

  98. 2026-07

    Local businesses in answer details. GET /answers/:id (and the MCP tool get_answer) now include a local_businesses array: the businesses ChatGPT displays in its local results widget for local-intent prompts, with title, address, phone, review counts, rating, website domain and ranking position, each matched to your brand or a tracked competitor via is_owned / competitor_id.

  99. 2026-07

    Bug fixes. MCP get_timeseries and get_summary now return real values for net_sentiment, the five sentiment_* breakdowns and avg_mention_position (previously every data point was null via MCP; REST was unaffected), matching the REST metrics semantics. GET /dimensions/all_mentions and GET /dimensions/all_citations now paginate in the database with deterministic ordering on created_at ties, so deep pages are fast and stable on large projects; the response shape is unchanged. Custom per-key rate limits are now honored on the global API throttle (the default remains 300 requests/minute; contact us for higher quotas).

  100. 2026-06 (late)

    AI Traffic API (Scale+). New endpoint GET /metrics/ai_traffic exposes the AI-referred traffic we measure from a project's connected web analytics provider (Google Analytics 4, Adobe Analytics, PostHog, Plausible or Piano): per-day users, sessions and conversions grouped by AI source (ChatGPT, Perplexity, Gemini, Claude and others), with totals and a conversion rate. New MCP tool: get_ai_traffic. Requires the Scale plan or above and a connected provider; projects without one return the new ERR_AI_TRAFFIC_NOT_CONNECTED (404) code.

  101. 2026-06 (late)

    Search Console API (Growth+). New endpoints expose the Google Search Console performance data we already sync for projects with a connected GSC property: GET /search_console/summary (headline impressions, clicks, CTR, average position, with optional country/device breakdown), GET /search_console/timeseries (day/week/month series), GET /search_console/queries and GET /search_console/pages (top queries/pages ranked by impressions, clicks, CTR or position, paginated). ctr is a 0..1 fraction and position is the impression-weighted average, matching the Search Console API. New MCP tools: get_search_console_summary, get_search_console_timeseries, get_search_console_queries, get_search_console_pages. Projects without a connected property return the new ERR_SEARCH_CONSOLE_NOT_CONNECTED (404) code.

  102. 2026-06 (late)

    Mention share by citing domain + batch source filters. New endpoint GET /citation_intelligence/mentions_by_domain (and MCP tool get_mentions_by_citing_domain): for the responses where each given source domain is cited, returns the brand-vs-competitor mention share, normalized so each domain's actors sum to 100%. GET /metrics/top_sources and GET /citation_intelligence/groups (and their MCP tools) gain a domains array (exact domain whitelist) and a collection_ids array (filter by several tags at once), so a wide domain x tag matrix is one call instead of one call per cell.

  103. 2026-06 (late)

    Team-member permission matrix now enforced on the API and MCP. An API key (or MCP/chat-agent session) owned by a restricted team member is gated by the same feature matrix as the web app: endpoints and tools outside the member's granted features return 403 ERR_INSUFFICIENT_PERMISSION (new error code). Account-owner and admin keys are unaffected, so existing integrations keep working unchanged. Outbound webhooks are now their own grantable permission feature (still Scale+).

  104. 2026-06 (late)

    Correct period aggregates for rate metrics in GET /metrics/summary. The total field for percentage metrics (visibility/mention_rate, citation_rate, ai_visibility_score/weighted_visibility, sentiment shares) is now the average across periods instead of a sum of period rates, which could exceed 100%. Count metrics (mentions, citations, responses) are still summed. Each summary row now includes an aggregation field ("sum" or "average") stating how total was computed. The same fix applies to the MCP get_summary tool, which also stops echoing the full series alongside the summary (call get_timeseries for series data) and gains a group_by argument (model or collection) returning one summary per group in a single call. GET /answers (and the MCP list_answers tool) accept a new query param for case-insensitive full-text search inside AI response texts: total becomes the exact match count and rows return a snippet + match_count instead of the full response text.

  105. 2026-06 (late)

    Team-member prompt permission and per-project prompt limits. Account owners can now turn off a team member's ability to add or delete prompts. When a member's permission is off, POST /prompts and the create_prompts MCP tool return 403 ERR_INSUFFICIENT_SCOPE for that member's key (read endpoints are unaffected). Owners can also set a per-project prompt limit in Project Settings; once a project reaches it, POST /prompts and create_prompts return ERR_LIMIT_REACHED (alongside the existing account-wide quota check) for everyone, including the owner, until the limit is raised. No new error codes or endpoints.

  106. 2026-06 (late)

    New MCP tool get_webhook_sample (Scale+), the MCP counterpart of GET /webhooks/sample/:event_type, so MCP clients can preview event payloads before subscribing. Plan gating aligned for the AI bot catalog: REST GET /dimensions/agent_bots now requires Scale or above (ERR_PLAN_REQUIRED below), while the MCP tool list_agent_bots is now available on every plan.

  107. 2026-06 (mid)

    Outbound Webhooks (Scale+, v1.9). New endpoints: POST /webhooks (subscribe a public HTTPS URL to a project event), GET /webhooks (list subscriptions), DELETE /webhooks/:id (unsubscribe), GET /webhooks/sample/:event_type (example payloads for integration editors). Seven event types: mention.created, competitor_mention.created, citation.created, prompt_execution.completed, sentiment.negative_detected, recommendation.completed, intelligence_task.completed. Deliveries are HMAC-SHA256 signed (X-LLMPulse-Signature), attempted up to 5 times in total with backoff, and subscriptions auto-disable after 20 consecutive failures. Create/delete require a read_write scope key. New MCP tools: create_webhook_subscription, list_webhook_subscriptions, delete_webhook_subscription. Webhooks power the new Zapier, Make and n8n connectors.

  108. 2026-06

    Content Intelligence renamed to GEO Writer. The feature and its API section are now labelled GEO Writer across the app and docs. This is a display-only rename: API endpoints (POST/GET /intelligence_tasks, GET /intelligence_tasks/:id), request/response shapes, error codes, and MCP tool names (create_intelligence_task, list_intelligence_tasks, get_intelligence_task) are unchanged. The marketing page moved from /features/content-intelligence to /features/geo-writer with a 301 redirect.

  109. 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 URL https://api.llmpulse.ai/api/v1/mcp into 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 of tools/list for users without access. API-key auth (Authorization: Bearer …) is unchanged and remains the recommended path for headless integrations like Data 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/*.

  110. 2026-05 (late)

    New recommendation type: Sentiment & Reputation (Scale+). recommendation_type on GET /recommendations (and the launch_recommendations MCP tool) now accepts sentiment_reputation in addition to ai_visibility, social_community and brand_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 get ERR_INVALID_PARAM/plan errors.

  111. 2026-05 (late)

    Prompt categorization filters. Every prompt is now auto-classified by prompt_type (search intent: informational, navigational, commercial, transactional) and brand_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_sources and /dimensions/prompts (which now also returns the two fields per prompt). Invalid values return ERR_INVALID_PARAM. The same filters are available as prompt_type / brand_kind args on the MCP tools get_timeseries, get_summary, get_sov and list_prompts.

  112. 2026-05 (mid)

    Agent Write Endpoints (v1.5). API keys now expose a scope (read vs read_write); pre-existing keys treat full as a synonym of read_write. Mutation endpoints (POST/PATCH/PUT/DELETE) now require a read_write scope key and return 403 ERR_INSUFFICIENT_SCOPE otherwise. 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.

  113. 2026-05

    Projects now expose brand_name separately from name in API and MCP payloads. brand_name is the brand label sent to LLMs and shown in customer-facing charts; name remains the internal project label. name is still returned for back-compat. mention_rate accepted as a synonym for visibility in /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. At the time of this release, active paid add-ons were Copilot, Claude, Grok, DeepSeek and Alexa for Shopping; Meta AI recurring execution was not yet active. Date-bucketed metrics standardized on Europe/Madrid for daily/weekly/monthly buckets, fixing off-by-one-day rows near midnight UTC.

  114. 2026-04 (late)

    Agent Analytics API (Scale+, Beta): GET /metrics/agent_traffic and GET /dimensions/agent_bots surface 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. MCP tools/list is now filtered by your plan, tools you can't use no longer appear in the catalog, and direct calls to gated tools return a clean ERR_PLAN_REQUIRED instead of leaking schema. MCP auth boundaries hardened for member-of-owner access.

  115. 2026-04 (mid)

    Citation Intelligence API: GET /citation_intelligence/groups (cited-URL clusters with source/type filters), GET /citation_intelligence/urls/:url_sha256, /occurrences and /content for per-URL drill-down. AI Model Insights Reports API: GET /reports/ai_model_insights/summary, /position_distribution and /ai_overview_results. Recommendations API: GET /recommendations and GET /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 across view, order, direction, granularity, model, source_type, sentiment, content_gap, recommendation_type, status, unknown values now return ERR_INVALID_PARAM instead of being silently ignored. source_type filter accepts owned, competitor, third_party in addition to classification lists. AI Overview results bucket by executed_at (not created_at), so retried/backfilled rows land in the correct day.

  116. 2026-04

    New POST /prompts endpoint for bulk prompt creation (up to 100 per request). New Content Intelligence API: POST /intelligence_tasks to create tasks, GET /intelligence_tasks to list with filters, GET /intelligence_tasks/:id for 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).

  117. 2026-03

    New endpoint GET /metrics/prompt_summary for paginated per-prompt metrics (responses, mentions, citations, visibility, citation_rate) in a single request

  118. 2026-02

    Added ai_visibility_score metric (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. Added responses metric (prompt execution count) and citation_rate metric (citations / responses x 100). API rate limits increased from 100 to 300 requests/minute. Added prompt filter to all metrics and dimensions endpoints.

  119. 2026-01

    Added MCP (Model Context Protocol) endpoint for AI integrations with Claude, ChatGPT, and other AI assistants

  120. 2025-12

    Sentiment metrics added to /metrics/timeseries (sentiment_very_positive/positive/neutral/negative/very_negative) and documented semantics

  121. 2025-09

    Metrics aligned with Overview (period totals with sticky, ratio-of-period-sums for visibility, propagation in avg_position), SOV breakdown, query filter in Top Sources, caching notes, Postman download & environment section

  122. 2025-08

    Initial public API docs (v1)