Changelog

What changed in the /v1 API and the MCP server, newest first, with every change that asks something of an integration.

What changed in /v1, newest first. /v1 grows by addition: new endpoints, new optional parameters and new response fields arrive without notice, so a client ignores fields it does not know. A change that asks something of an existing integration is listed under Changed with what to do.

October 2026

Changed

  • A webhook replay keeps the event id. POST /v1/brands/{brand_id}/webhooks/{id}/deliveries/{delivery_id}/replays sends the same X-RP-Event-Id and body as the first delivery, with a new X-RP-Delivery-Id. A receiver that dedupes on the event id now skips a replay of an event it already processed; dedupe on the delivery id to run it again.
  • Keyword research defaults to suggestions. On POST /v1/brands/{brand_id}/seo/keyword-research, a request without mode now returns suggestions (longer phrasings that contain the seed), as the app, Agent Mode and the MCP do; before, it returned ideas. Send mode=ideas to keep related keywords by topic.
  • Community searches pick their market and refund an empty run. POST /v1/brands/{brand_id}/community-searches takes optional country and language (the brand’s market by default; a country alone takes its language). A search that finds no thread is refunded and keeps the threads an earlier run of that keyword and market found.
  • A critical finding fails a page audit. On POST /v1/page-audit, passed is false when any recommendation is critical (a noindex, Googlebot or Bingbot blocked, JSON-LD that does not parse, a canonical to another host, no HTTPS), whatever the score. A CI step that gates on passed now fails those pages. Blocking only training crawlers (GPTBot, CCBot, Google-Extended) no longer lowers the score.
  • Writing a brand’s description completes its research. On PATCH /v1/brands/{brand_id}/facts, a non-empty description sets research_status to complete, so a brand whose website the research could not read is ready for reports right away.
  • Prompts read every answer, and the costly part on request. On GET /v1/brands/{brand_id}/prompts:
    • platform_results counts every answer of each engine: results, mentions and position, the brand’s mean position in the answers that name it. The latest answer’s answer_id, brand_appears, rank and at are gone; read one answer with GET .../prompts/answers?prompt_hash=....
    • A trend point carries day, a date, instead of at. Days are counted in tz, a new optional IANA zone (default UTC).
    • brands_named and domains_cited come only with detail=true, a slower read capped at 100 rows a page: detail=true with a larger limit answers 400 validation_error. Without it (the default) both are empty. Ask for detail=true on the rows you need, or on one prompt with prompt_hash.
  • Fan-outs: source is a list, and both by default. On GET /v1/brands/{brand_id}/fanouts, source takes ai and google and can repeat; all answers 400 validation_error. With no source, the engines’ searches and the People also ask questions come back together, as in the app (before: ai alone). Send source=ai to keep only the engines’ searches.
  • No previous_* fields on cited pages and domains. GET /v1/brands/{brand_id}/citations/pages drops previous_citation_count and previous_share, and .../citations/domains drops previous_citation_count. Compare first_half_citation_count with second_half_citation_count, or read two periods.
  • category repeats on every Visibility read. The pages, domains, series, social posts and groups, fan-outs, prompts and their answers take category more than once (up to 50 values of up to 200 characters) and read the answers to prompts of any of them.
  • Prompt tracking is active, paused or one_off, and repeats. On GET /v1/brands/{brand_id}/prompts, tracking=tracked answers 400 validation_error: send tracking=active&tracking=paused for every scheduled prompt. paused is new: scheduled prompts that are not running. type and intent repeat too, and read the prompts of any value given.
  • Schedule analytics weigh every answer and trend by halves. On GET /v1/scheduled-reports/{id}/analytics, avg_visibility and each prompt’s avg_visibility_pct are the answers naming the brand over every answer, no longer a mean of run averages, and trend_delta (with trend_direction) compares the newer half of the runs with the older half, the middle run of an odd count left out, instead of the latest run with the one before. The same numbers the app shows; same fields.
  • Engines named as the app names them. platforms_missed on GET /v1/brands/{brand_id}/content-opportunities and the engine lists of GET /v1/brands/{brand_id}/content-briefs/citation-uplift read Google AI Mode (AI Overviews), ChatGPT and Claude (before: Google AI, ChatGPT Search and Claude Search), and so does the opportunity’s reason. A client that matches these names updates them.
  • rankprompt_score is the Outreach score, recomputed from the page’s signals. On GET /v1/brands/{brand_id}/citations the score (0 to 100) now weighs how much AI cites the page, whether it names your competitors and not you, how reachable the site is and how well the page fits, and is recomputed whenever one of them changes. It is 0 for your own site, a competitor’s site and a page that already links to you. Values shift once; a client that filters on a threshold checks it again.
  • A description written to a brand’s facts ends its research. PATCH /v1/brands/{brand_id}/facts with a non-empty description sets research_status to complete, so a brand the research could not read is ready for reports. A brand deleted while the write runs answers 404 not_found instead of 500 internal_error.

Removed

  • GET /v1/brands/{brand_id}/citations/by-domain. Read GET /v1/brands/{brand_id}/citations/domains: the same counts per domain, with filters by report, engine, date and kind of site.
  • domain_category and top_domain_category on citations, and the domain_category filter. Read site_type and relation on GET /v1/brands/{brand_id}/citations, and narrow by them on .../citations/pages. The MCP’s rankprompt_list_citations no longer takes domain_category.
  • summary.prompts_truncated on content opportunities. GET /v1/brands/{brand_id}/content-opportunities read every prompt of the ten newest reports, so it was always false; summary.prompts_analyzed says how many were read.

Added

  • Export a brand’s whole history. POST /v1/brands/{brand_id}/exports starts an export of citations and answers (optional date window and filters) and answers 202 with Location; GET .../exports/{export_id} returns its status, progress, row counts and, once done, links to gzipped NDJSON files, valid for 15 minutes and kept for 24 hours. One export runs per caller and brand: asking again while it runs returns it. The citations dataset needs read:citations. Free on every plan; use it instead of paging a brand’s whole history.
  • Analytics of a schedule by period. GET /v1/scheduled-reports/{id}/analytics takes optional date_from and date_to.
  • Prompt discoveries say when a list is still being built. GET /v1/brands/{brand_id}/prompt-discoveries returns pending: true with an empty page while a brand’s competitor list is first built; ask again in a minute.
  • Google Maps places in Google AI Mode (AI Overviews) answers. A report citation of a place the answer lists carries google_place_url, its Google listing, and google_place: rating, reviews, category, address, phone and position among the places the answer lists. Within a few hours of the report the place resolves to the business’s website, which becomes the citation’s url, so it counts under that domain. Both are null for every other citation.
  • An endpoint for every job the app’s Agent does. New endpoints, by resource:
    • Tasks: GET /v1/brands/{brand_id}/tasks/{task_id}, one task with a snapshot of where it came from.
    • Competitors: GET /v1/reports/{report_id}/competitors, every entity a report’s answers name.
    • Sources: GET .../citations/offsite and .../citations/offsite/pages, the third-party pages the answers cite; GET, POST and DELETE /v1/brands/{brand_id}/tracked-pages, the pages Sources follows.
    • Community: GET and POST .../community-threads, PATCH .../community-threads/{thread_id}, PUT .../context and PUT .../draft (reply drafts are never posted), and POST .../community-searches.
    • Outreach targets: POST .../outreach/citations, PATCH .../outreach/citations/{citation_id}, POST .../backlink-verifications, POST .../outreach/processing-jobs and GET .../outreach/authors.
    • Contacts and contact lists: /v1/brands/{brand_id}/contacts (list, create, edit, tag in bulk, a contact’s pages) and /contact-lists (list, create, edit, preview a filter, add and remove members).
    • Email templates and sequences: /v1/brands/{brand_id}/email-templates and /email-sequences, with step variants and their results.
    • Campaigns: /v1/brands/{brand_id}/campaigns (list, create, read, timeline, preview); PATCH with status launches, pauses or ends one.
    • Emails: /v1/brands/{brand_id}/emails (list, summary, replies, create, AI composition, edit, thread, reply drafts) and POST .../emails/{email_id}/sends, which sends from your Gmail.
    • Mailboxes: GET /v1/me/mailboxes, PATCH and DELETE /v1/me/mailboxes/{mailbox_id}, and POST /v1/me/mailbox-connection-links.
    • Content: GET /v1/brands/{brand_id}/content-calendar and POST .../content-briefs/{brief_id}/outlines.
    • Publishing on GitHub: GET .../github/publishing-profile, POST .../github/publishing-profile-inferences and POST .../github/blog-scaffolds.
    • SEO: GET .../seo-pages/candidates, the sitemap pages not tracked yet.
    • Analytics and Google Business Profile: GET .../analytics/summary, GET .../gbp/locations, .../gbp/post-schedules and a location’s reviews, POST a scheduled post and a review reply.
    • Shares: GET /v1/shares across your brands and DELETE /v1/shares/{share_id}.
    • Client reports: /v1/client-reports (list, create, read, edit, facts, publish a version), a version’s delivery and its public link.
    • Agency (Agency Plus): /v1/agency/portfolio, /heatmap, /competitors, /tasks, /tasks/summary, /reviews, /prospect-lists, /prospects/funnel and POST /v1/agency/prospect-searches.
    • Lead webhooks (account owner, Agency Plus): GET and POST /v1/me/webhooks, DELETE /v1/me/webhooks/{webhook_id}.
  • New scopes. read:outreach and write:outreach (write:outreach sends email from your mailbox), write:citations, read:community and write:community, read:gbp and write:gbp (write:gbp publishes on Google), read:client-reports and write:client-reports, read:agency and write:prospects. Keys holding read:all or write:all reach them too.
  • New error code account_plan_required (403). An account level feature (mailboxes, client reports, the agency portfolio, lead webhooks) needs a plan the account does not have; details.required_plan names it.
  • The autopilot pauses itself after three failed articles in a row. GET /v1/brands/{brand_id}/content-autopilot can answer pause_reason: "failures"; resume it with PATCH once the cause is fixed.
  • Generated prompts can replace a draft’s. POST /v1/reports/{report_id}/prompts takes replace with auto_generate: true replaces the report’s prompts with the generated set (put back if generation fails); left out, the generated prompts are added, as before.
  • Brands the answers name. GET /v1/brands/{brand_id}/prompts/answers/brands ranks the brands every answer under the Visibility filters names, most named first, with each one’s mean place.
  • Answers that name a brand or cite a domain. GET /v1/brands/{brand_id}/prompts/answers takes named, a brands_named[].name, and domain, a domains_cited[].domain; a scheme, a path and a leading www. are ignored, so domain=www.runnersworld.com reads runnersworld.com.
  • Days in your time zone. GET .../citations/series, GET .../prompts/answers/series and the prompt rows’ trend take tz, an IANA zone such as America/New_York (default UTC), and count days and weeks in it. An unknown zone answers 400 validation_error.
  • Share of voice over any relation. GET /v1/brands/{brand_id}/competitors/summary takes category, the relations counted (direct_competitor, indirect_competitor, ai_platform, publisher, other), repeatable; left out, direct and indirect competitors.
  • One prompt’s row. GET /v1/brands/{brand_id}/prompts takes prompt_hash, as its answers do, and lists only that prompt text.
  • Your Google demand as a discovery source. GET /v1/brands/{brand_id}/prompt-discoveries?source=google_demand joins the site’s Search Console queries of the last 28 days with the keywords its domain ranks for, one row per query, with origin (gsc, ranked or both), ctr, ranked_position and etv beside the clicks, impressions, position, volume and difficulty. It needs the read:analytics and read:seo scopes, takes search and pages with limit and offset.
  • Past-due refusals link to the card. 403 api_subscription_past_due and subscription_past_due carry details.billing_url, the Subscription page where the card is updated, and details.docs_url, the Past-due billing section. details.upgrade_url is unchanged. Refused calls are recorded in /v1/me/usage at 0 units and 0 credits, as they never spent any.

MCP

  • rankprompt_create_data_export and rankprompt_get_data_export export a brand’s whole citation and answer history (see the exports entry above).
  • The tools are the in-app Agent’s, generated from its catalog, and each one calls its own /v1 endpoint with that endpoint’s scope, request units and credits: names follow the Agent (rankprompt_get_brand_info, rankprompt_research_keywords, rankprompt_create_share), a tool that took an action is split into the Agent’s tools (the table below), and the outreach, community, Google Business Profile, client report and agency tools are on the list. dry_run: true previews a write; a tool that deletes or acts outside Rank Prompt answers a dry run of the call and runs once called again with confirm: true after you agree. rankprompt_schema with tool names its endpoint. The playbooks of rankprompt_skills_list and rankprompt_skills_read are the Agent’s skills. The consent screen recommends reading outreach, tracking pages and read:meta; sending outreach email is not recommended.
  • Tool names changed. A script or a saved prompt that names a tool needs the new name. The tools whose name stayed (rankprompt_create_brand, rankprompt_research_brand, rankprompt_create_report, rankprompt_list_reports, rankprompt_get_report, rankprompt_list_tasks, rankprompt_create_task, rankprompt_update_task, rankprompt_list_citations, rankprompt_list_competitors, rankprompt_merge_competitors, the alias suggestion tools, rankprompt_list_content_opportunities, rankprompt_generate_article, rankprompt_regenerate_article, rankprompt_publish_article, the three audit runs, rankprompt_buy_credits, rankprompt_subscribe and the prime, schema, read, write, delete and skills_* tools) may take other arguments: read them with rankprompt_schema.
BeforeNow
rankprompt_list_brandsrankprompt_list_my_brands
rankprompt_get_brand_facts, rankprompt_set_brand_factsrankprompt_get_brand_info, rankprompt_update_brand_info; the full facts are rankprompt_read and rankprompt_write on /v1/brands/{brand_id}/facts
rankprompt_add_promptsrankprompt_add_report_prompt (prompts), rankprompt_generate_report_prompts (auto_generate, replaces the draft’s prompts)
rankprompt_get_report_summaryrankprompt_get_report_visibility_breakdown
rankprompt_run_reportrankprompt_analyze_report_visibility
rankprompt_get_jobrankprompt_read on /v1/jobs/{job_id}
rankprompt_list_citation_domainsrankprompt_list_cited_domains
rankprompt_generate_ai_suggestionsrankprompt_generate_report_recommendations
rankprompt_get_creditsrankprompt_get_credit_balance
rankprompt_track_seo_pagerankprompt_add_seo_page
rankprompt_create_schedulerankprompt_create_scheduled_report
rankprompt_create_article, rankprompt_edit_articlerankprompt_import_article, rankprompt_update_article
rankprompt_content_planrankprompt_plan_articles, rankprompt_get_content_plan
rankprompt_content_preferencesrankprompt_get_content_preferences, rankprompt_update_content_preferences
rankprompt_citation_upliftrankprompt_get_citation_uplift
rankprompt_publish_targetsrankprompt_list_cms_connections
rankprompt_connect_wordpressrankprompt_connect_publishing_target
rankprompt_reviewrankprompt_get_article_review, rankprompt_share_article_review, rankprompt_reply_to_review
rankprompt_sharerankprompt_create_share (a report; other targets are rankprompt_write on their /shares path), rankprompt_list_shares, rankprompt_revoke_share
rankprompt_brand_auditrankprompt_run_brand_audit, rankprompt_get_brand_audit, rankprompt_list_brand_audits
rankprompt_keywordsrankprompt_list_tracked_keywords, rankprompt_track_keywords, rankprompt_check_keyword_ranks
rankprompt_keyword_researchrankprompt_research_keywords
rankprompt_seo_competitionrankprompt_get_ranking_keywords, rankprompt_get_keyword_gap, rankprompt_refresh_domain_overview, rankprompt_refresh_keyword_gap
rankprompt_prompt_insightsrankprompt_get_prompt_insights
rankprompt_analyticsrankprompt_get_analytics_summary
rankprompt_search_consolerankprompt_get_search_console (performance)

The actions without a tool of their own (keyword history and candidates, prompt insight lookups and pins, Search Console URL inspection and sitemaps, the analytics connection and properties, brand audit page analysis and recommendations) are rankprompt_read or rankprompt_write on their /v1 path.

September 2026

Changed

  • Three lists page on the server, with no cap.

    • GET /v1/scheduled-reports/{id}/prompt-history/{region_config_prompt_id} is a cursor list: runs move from runs to data, object is list, and pages use limit and cursor (has_more, next_cursor). The prompt fields stay on the envelope. It returns every completed run, not only the latest 50.
    • GET /v1/brands/{brand_id}/seo/keywords/{keyword_id}/history is a cursor list: checks move from checks to data, object is list, keyword stays on the envelope. It is no longer capped at 60 checks.
    • GET /v1/brands/{brand_id}/seo/keywords/{keyword_id}/prompts is offset paginated (limit, offset, total, has_more, object: list). It is no longer capped at 200 prompts, and runs, answers and appearances count completed runs and resolved answers only (before: every report’s runs, processing and failed ones included, and answers still being checked), so they can read lower.

    Read data and follow next_cursor or offset.

  • Competitors: category takes the five categories only. On GET /v1/brands/{brand_id}/competitors, category accepts direct_competitor, indirect_competitor, ai_platform, publisher and other, and can repeat. Any other value, all included, answers 422 validation_error (before: all listed every entity and an unknown value an empty page). To list every entity, leave category out.

  • The spec requires Idempotency-Key on every POST. The API always refused a POST made with an API key without it (400 idempotency_key_required); the OpenAPI spec now marks the header required there, with its format, so a client generated from it sends one (before: optional in the spec). dry_run=true still ignores it. Regenerate your client and send a new key per operation.

  • SEO audits: inp_ms is now tbt_ms. In the core_web_vitals of every SEO audit (GET /v1/brands/{brand_id}/seo-pages, .../seo-pages/{page_id} and its audits), inp_ms is renamed tbt_ms. The value always was the lab Total Blocking Time: a lab run has no interactions, so real INP stays in field_data. Stored audits are rewritten and inp_ms is no longer returned. Read tbt_ms.

  • A report is shared once it completes. POST /v1/reports/{report_id}/shares answers 400 validation_error while the report is processing (before: it shared the report as it stood). Create the share after report.completed, or once GET /v1/reports/{report_id} reads completed.

  • upgrade_url only when the key’s creator pays. On 402 insufficient_credits with details.reason: credits_budget, details.upgrade_url is present only when the credits are the key creator’s own. When the work is charged to someone else (the owner of a brand shared with you, or the owner of the team account the key acts in), it is absent and the message says who tops up (before: always present). The same holds for request_quota_exceeded, api_subscription_required, api_subscription_past_due and subscription_past_due on a key that acts in a team account. When upgrade_url is missing, show the message instead of a top-up link.

  • A scheduled publish waits in our queue. On POST /v1/brands/{brand_id}/content-briefs/{brief_id}/publish, scheduled_for no longer creates the post scheduled in the CMS: the post waits on the site as a draft (the hosted blog keeps it in Rank Prompt) until our queue makes it live at that time, retrying a site that does not answer. Scheduling a brief that is already live leaves the live post as it is until that time, then updates it (before: the live post was rescheduled). scheduled_for with publish_status: draft answers 400 validation_error. Send scheduled_for with publish_status: publish (the default), and read the time from the publication’s scheduled_for, not from the CMS.

  • A prompt’s trend_delta counts the engines both runs asked. In GET /v1/scheduled-reports/{id}/analytics, a prompt’s trend_delta, and so its trend_direction, is the change over the AI platforms both of its last two runs asked it on, so an engine added or removed no longer moves it (before: the gap between the two runs’ visibility). It can differ from the gap between the last two sparkline_data values. No action needed unless you recompute it from sparkline_data.

  • platforms_missed names Google’s engine AI Mode. In GET /v1/brands/{brand_id}/content-opportunities, Google’s engine is now named AI Mode, not Google AI, on sets computed from now on. Match both if you filter on it.

  • Every prompt is scanned for content opportunities. A set now reads every prompt of the brand’s ten newest reports (before: up to 200), so summary.prompts_truncated is false on every set computed from now on. No action needed.

  • AI platforms: one price, two engines retired. Every plan runs the same six engines, and none costs more than another:

    • The writes that take ai_platforms (POST and PATCH /v1/reports, POST and PATCH /v1/region-configs, POST /v1/scheduled-reports) accept chatgpt, claude, gemini, grok, perplexity and ai_overviews. Any other value, chatgpt_search and claude_search included, answers 422 with the code ai_platform_unsupported; details.value names the value, details.supported lists the accepted ones and, for a retired engine, details.replacement names the engine that runs in its place (chatgpt for chatgpt_search, claude for claude_search).
    • Omitted, ai_platforms defaults to ["chatgpt", "claude", "ai_overviews"] (before: ["chatgpt", "perplexity"]).
    • A prompt costs 1 credit per three platforms, rounded up: 1 credit for one to three, 2 for four to six, all six included. Four platforms without a premium engine now cost 2 credits per prompt where they cost 1.
    • Reads still return chatgpt_search and claude_search on past results. A region config is the schedule’s current setting, so GET /v1/region-configs returns the engine that runs in place of a retired one, and the same list can be sent back in a PATCH.

    Send one of the six values, and budget four or more platforms at the new price.

  • GET /v1/brands/{brand_id}/citations/by-domain counts from the answers. The rollup now returns the same numbers as GET /v1/brands/{brand_id}/citations/domains without its filters, and every count means one thing:

    • actionable_count and avg_rankprompt_score are gone.
    • citation_count is how often the answers cited a page on the domain (before: the brand’s citation rows on the domain in the rollup window).
    • with_backlink_count is how many cited pages on the domain were found linking to the brand (before: citation rows whose page linked to the brand).
    • brand_mentioned_count is how many analyzed cited pages on the domain name the brand.
    • rollup_source_count is the total citations across every domain of the brand (before: the citations that entered the filtered rollup).
    • top_domain_category is null while the site is being classified (and deprecated, see below).

    For filters by report, engine, date or kind of site, and more fields per domain, read /citations/domains.

  • has_backlink is null until the page is read. On a citation, has_backlink is false only once an Analyze or a backlink check read the page, and null before that (before: false for a page nobody read). brand_mentioned follows the same rule, and the new analyzed_at says when the page was read. The has_backlink=false filter of GET /v1/brands/{brand_id}/citations now matches only pages that were read, so it returns fewer rows (before: every page nobody read matched too). Treat null as unknown, never as no.

  • LinkedIn values are decoded. linkedin_handle carries the handle as people read it (instituto-tecnológico-de-buenos-aires, not the percent-encoded form), and linkedin_kind is one of post, article, person, company, school, showcase or other (before: profile for a member page, and no school, showcase or other). An open set: new values can appear.

  • domain_category and top_domain_category are derived and deprecated. Both now follow from the new site_type and relation (below): OWNED when relation is owned, else the category of the site type, and top_domain_category is null while a site is being classified. Read site_type and relation instead; the two fields stay until the version that removes them is announced here.

  • Prompt history keeps one citation list. SchedulePromptRunPlatform.citations, the flat list of URLs, is gone; citation_details carries the same URLs with their title, source and favicon.

  • Tasks have seven states. What reports, Brand Audit, Site Health, Search Console and content opportunities find now lands in suggested until someone accepts it into backlog or moves it to dismissed, and a dismissed finding is not suggested again. Without status, the task list holds accepted work (backlog to done), as before; ask for status=suggested or status=dismissed to read those. A suggested task nobody accepts, dismisses or edits for 90 days is deleted nightly; if the finding still applies it comes back as a new suggestion with a new id.

Added

  • What a weekly tip measured. A task with source_type: weekly_tip carries tip: the prompt, the AI platforms that named the brand when the tip was made (named of engines), and once the task is done, the same prompt on the next run (measured_before against measured_named, over measured_engines).
  • The first charge of a new subscription. POST /v1/me/subscriptions returns first_charge_cents on checkout: amount_cents less the first-month offer when the account has one, so an agent can quote it.
  • Prompt discovery. GET /v1/brands/{brand_id}/prompt-discoveries reads questions and keywords worth tracking from a free source: search_console (every query the site gets impressions for), ranking, competitors (prompts whose answers name a competitor and not the brand) or fanouts. POST on the same path runs a paid research around a seed or a page read (1 credit, free when the same request ran in the last 24 hours). Every row says whether it is already tracked as a prompt or a keyword.
  • What kind of site cited you. Citations, GET /v1/brands/{brand_id}/citations/pages and .../citations/domains carry site_type, what the whole site is (reddit, youtube, linkedin, wikipedia, qa_forum, social, news, reviews, reference, institutional, company, marketplace and more: an open set, so a client accepts values it does not know), and relation, the site’s relation to the brand (owned, competitor or none). Both lists filter on them: site_type and relation, each repeatable, and .../citations/series draws one line per site type unless group asks for relation, page_category, domain or url.
  • Sources. Read from the answers themselves under the Visibility filters (report_id, scheduled_report_id, platform, date_from, date_to, category):
    • GET /v1/brands/{brand_id}/citations/pages lists every cited URL, with its card once the page is read (image_url, published_at, modified_at, author, site_name, schema_types), and .../citations/domains the same by domain, with each domain’s reach. Both carry first_half_citation_count and second_half_citation_count, the citations of the first and last half of the runs read in the window, in the order they started (with an odd count the middle run counts in neither; null with fewer than two runs), and sort=change and sort=trend order by the second half against the first.
    • .../citations/series counts citations per day or week.
    • .../citations/social lists the Reddit posts, YouTube videos and LinkedIn pages cited, with author, image_url and published_at from the page; with network=linkedin, kind (repeatable) keeps only some kinds of page (post, article, person, company, school, showcase, other). .../citations/social/groups rolls them up by subreddit, channel or author. Both need the brand owner on Starter or with an API subscription, as Social does in the app, and answer 403 brand_plan_required below it.
    • GET .../fanouts lists the web searches the engines ran, or with source=google the People also ask questions of the tracked keywords, each with its keywords (repeat source for both); sort takes times, keywords, prompts or last_seen. GET .../fanouts/prompts lists the prompts behind one search.
  • Citations carry the page’s card. GET /v1/brands/{brand_id}/citations and GET /v1/citations/{id} add image_url, published_at, modified_at, author, site_name and schema_types, null until the page is read.
  • Read but not cited. Report answers (GET /v1/reports/{id}) and the runs of a schedule’s prompt history carry retrieved: the pages the engine read while answering that its text does not cite (they stay in citations too).
  • The score’s noise band. GET /v1/reports/{id}/summary adds visibility_band: the 95% band of the score (low, high) and the change against the previous run of the same schedule location, counted only over the answers both runs asked (shared_answers, shared_score, previous_score, delta, movement), with the prompts new to this run apart (new_prompts). Read a move inside the band as normal variation.
  • Prompts. GET /v1/brands/{brand_id}/prompts lists every prompt the brand tracks or ran once, one row per text, with mentions, brands_named, platform_results, domains_cited, languages and volume. PATCH on the same path pauses, resumes or re-categorizes up to 500 tracked prompts across every schedule and location of the brand in one call, and GET .../prompts/answers/series counts the answers per day and engine.
  • Scheduled reports. POST /v1/scheduled-reports takes region_configs to create the markets with their prompts in the same call, POST /v1/region-configs takes copy_report_prompts to seed a market from a finished report, POST /v1/scheduled-reports/{id}/duplicates copies a schedule with its markets and prompts, GET /v1/scheduled-reports/{id}/runs groups the reports of every run, and the schedule analytics add regions with each market’s visibility per run. See Scheduled reports.
  • Competitors. GET /v1/brands/{brand_id}/competitors takes category more than once and tag, and returns facets, the entities per category and per tag, each counted under the other filters. Competitors carry tags you can set with PATCH, GET .../competitors/duplicates groups the entities that look like one company (offset paginated), and GET .../competitors/summary returns the share of voice of the brand and its competitors in a period, read through the directory: an alias counts under its competitor’s name, and a removed competitor is left out.
  • Tasks. GET /v1/brands/{brand_id}/tasks takes search, a case-insensitive part of the title, and source_type adds content_opportunity.
  • Content.
    • POST /v1/brands/{brand_id}/content-briefs and .../content-briefs/generations take opportunity_id, the content opportunity the article answers, as a plan item already did.
    • GET /v1/brands/{brand_id}/content-opportunities and POST .../content-opportunities/refreshes take search (every word must appear in the title, topic, keywords or competitor, ignoring case and accents; summary.total counts the matches) and content_type, the format an opportunity suggests.
    • GET /v1/brands/{brand_id}/content-autopilot reads the autopilot and PATCH sets it up, changes, pauses or resumes it: weekly slots, destination, publish policy, monthly cap, topics and quality bar.
    • GET /v1/brands/{brand_id}/content-briefs/{brief_id}/interlinks lists the related posts on the same site that could link to a live article, each with the sentence to add, and POST on .../interlinks/{interlink_id}/applications or .../dismissals applies or dismisses one.
    • A CMS connection’s provider can be wordpress, ghost, shopify, webflow, wix, github or webhook (before: only wordpress; the API creates WordPress connections, the rest come from the dashboard). An open set: new values can appear, so a client accepts values it does not know. A webhook connection’s site_url is only its host unless you own the brand, since the rest of that URL is its secret. Publishing to a github repository opens a pull request, unless the repository is set to commit directly: the publication answers draft with its review_url and goes live when it merges.
    • A brief’s publications carry review_url and note, what the last send could not do as asked.
  • Tracked keywords carry the Google page around them. GET /v1/brands/{brand_id}/seo/keywords and GET /v1/brands/{brand_id}/seo/keywords/{keyword_id} add serp: People also ask, related searches, the AI Overview (whether it cites the brand) and the featured snippet from the last rank check in that market, with checked_at; null until a rank check has read it. In GET .../seo/keywords/{keyword_id}/history, keyword.serp also carries the AI Overview’s references, text and names_brand and the page’s discussions and videos, and each rank check ai_overview_cites_brand and ai_overview_names_brand.
  • SEO audits. Each issue of an audit carries savings_ms and savings_bytes, what fixing it would save as Lighthouse estimates it.
  • Search Console. GET /v1/brands/{brand_id}/search-console/performance with dimension=query reads every query Search Console exposes for the window, not a top 1,000, paged with limit and offset, with total and has_more.
  • AI traffic that converts. GET /v1/brands/{brand_id}/analytics/ai-traffic: the totals, sources, landing pages and daily points carry GA4 key_events and revenue, and the totals currency_code.
  • Webhooks. destination_type (generic, slack or discord) on create, read and PATCH posts a readable message to a Slack or Discord incoming webhook, still signed. POST /v1/brands/{brand_id}/webhooks/{webhook_id}/test-deliveries sends a sample of one subscribed event now and answers with what the endpoint returned, and deliveries carry is_test and duration_ms.
  • Keys in a team account. A key acts in the account that was active when it was created. GET /v1/me adds account_id, account_role and account_plan, GET /v1/me/usage takes account_id to count only the calls made in that account, and a key whose creator is no longer a member of its team account answers 403 account_membership_required.
  • MCP. rankprompt_discover_prompts, rankprompt_sources, rankprompt_list_prompts, rankprompt_list_fanouts, rankprompt_list_social_citations and rankprompt_share_of_voice are new, and rankprompt_skills_list also lists the skills of the in-app Agent. See MCP server.