Skip to main content
The Improve group of the GEO sidebar turns scan results into work. Content Gaps lists the questions where engines recommend someone else, Write plans and drafts articles that answer them, and Settings controls what a scan covers.

Content gaps

The Content Gaps page (/geo/gaps) is subtitled “Questions engines answer without mentioning you”. It has two gap types, switchable with the Gap type control, plus a text filter and an All engines filter.

Prompt gaps

A prompt gap is a tracked prompt where competitors are mentioned and your brand is absent. Notra computes it from the latest answer per prompt and engine over the last 30 days (first turn only, up to 400 checks):
  1. For each prompt, count the checks where you were mentioned and the engines where you were missing.
  2. The prompt is a gap when you were missing from at least half of the engines that answered it.
  3. The Brand mentions column lists the tracked competitors named in those answers. Only competitors you track (by name or synonym) are counted, so keep the competitor list complete.
  4. The Opportunity score is (1 - ownMentionRate) * competitorCount * engineCoverage, where engineCoverage is the number of engines that answered. Gaps are sorted by opportunity, highest first, and shown as a five-step meter.
The table columns are Content (the prompt, with its title when one exists), Opportunity, Missing engines, and Brand mentions. Each row carries a write action whose label follows the brief’s state: Write when no brief exists, Review for a draft brief, Writing while the writer runs, and Open post once the article exists.

Search gaps

A search gap is a Google Search Console query suggestion that you have not turned into a tracked prompt yet. The table shows Content and Impressions (the sum of impressions across the queries behind the suggestion). Search gaps require the Search Console connection on the Prompts page; without it the page says No search gaps with “Connect Search Console on Prompts to pull queries you don’t cover yet.”

Empty states

  • No scan yet: the project has no scan results; press Run scan.
  • No prompt gaps: “Engines already mention you on the questions you track.”
  • Scanning engines: gaps appear once the running scan finishes.

Gaps from the API

brief is null or { briefId, status, postId, workingTitle } when a brief has already been planned for that gap. hasScanData is false until the project has at least one scan result. This route needs the briefs.read scope.

The Write flow

Writing is a two-step flow: plan a brief, then approve it. Approval hands the brief to the writer, which produces a draft article in Content.
1

Open the Write dialog

From a gap row press Write, or open the Write page and press New article. The dialog has five sections: Prompt (required), Format (required), Brand identity, Sitemap, and Competitors. Formats offered in the dashboard are Guide (“A long article that answers the prompt directly”), Listicle (“A numbered list that buyers can scan and cite”), and Comparison (“Compares the brand with its alternatives”). The sitemap section lets the planner pick internal links from the pages of your site; the competitors section chooses which tracked competitors the article should position against.
2

Plan the brief

Notra researches the topic against your brand context, the current gap prompts, the chosen competitors, and the sitemap pages, and writes a brief with a working title, audience, intent, sections with claims, questions to answer, internal links, and an acceptance checklist. Planning books AI credits. The brief opens for review in Draft state.
3

Approve

Approving claims the brief and starts the writer. The Write page lists every brief with its state: Draft, Queued, Writing, Done, or Failed. While it runs the page shows Writing the article.
4

Open the draft in Content

When the run completes, the brief points at a post and opens in Content as a blog post draft, where you edit and publish it like any other post. A failed brief can be approved again.

Billing

Planning a brief reserves AI credits and does not count toward a plan quota. The approved writer run is billed as a long-form post: it draws from the plan’s long-form post quota first and falls back to AI credits when the quota is used up. Both steps fail with 402 when neither is available. See Billing.

Plan a brief from the API

string
required
3 to 200 characters. Replaced by the source prompt when sourceKind is gap, prompt, or search_console.
boolean
default:"false"
Start the writer in the same call instead of leaving the brief in draft.
string
One of guide, comparison, listicle, how-to, faq, alternatives.
string[]
Up to 8 ids; only the first is used and it overrides the project’s brand identity.
string[]
Up to 25 tracked competitor ids to position against.
string
Sitemap whose pages the planner may link to.
string
One of manual, gap, prompt, search_console.
string
Gap, prompt, or search-console suggestion id. An open brief for the same source is reused instead of planning a new one.
Planning is synchronous. If it exceeds four minutes the API returns 409 while work may still finish in Notra. Do not retry; list the project’s briefs to find the result. This endpoint allows 10 requests per 10 minutes per organization.

Approve and follow the run

The response is 202 Accepted. Only briefs in draft or failed can be approved; anything else returns 409. The limit is 20 requests per 10 minutes per organization. Poll GET /v1/projects/{projectId}/geo/briefs/{briefId} until status is completed or failed. The brief object carries status, autoApproved, runId, postId, humanized, error, createdAt, updatedAt, and completedAt. GET /v1/projects/{projectId}/geo/briefs lists every brief with id, topic, workingTitle, status, postId, and createdAt. Once postId is set, read the article through the Posts API.

GEO settings

The Settings page (/geo/settings) is subtitled “How your brand is identified and where prompts are scanned.” It autosaves; the header shows Saving… and Saved, or “Add a company name to save” when the name is empty. Competitors are managed on the Competitors page, and the Google Search Console link lives on the Prompts page, not here.

Settings from the API

PATCH writes the full settings document and re-arms the recurring scan.
string
required
1 to 128 characters.
string[]
required
Up to 10 entries.
string[]
Paths that count as a conversion when an AI referral reaches them. Prefix match. Omit to keep the stored list.
string[]
Additional hostnames that send AI traffic to this project, besides the brand website. Up to 20. Subdomains of a listed domain are included. Omit to keep the stored list.
string[]
required
1 to 4 supported language codes. An unknown code is rejected with 400.
string[]
required
1 to 64 model ids from the catalog this organization can see (the ids GET /geo/settings returns). An unknown id is rejected with 400. Engines not visible to the caller keep their stored selection.
boolean
required
Forced off without the ZDR add-on.
string[]
required
Up to 64 model ids allowed to run despite lacking ZDR.
boolean
required
Whether recurring scans run.
integer
required
One of 24, 48, 72, 168, 336, 720.
The response echoes the stored settings together with scanStartedAt, lastScanAt, and isScanning, and a competitors array that is read-only here. Both routes need the geo-settings scope.

Plan a content brief

Full request and response schema.

Blog posts

What happens to the draft once it lands in Content.
Last modified on September 13, 2026