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):- For each prompt, count the checks where you were mentioned and the engines where you were missing.
- The prompt is a gap when you were missing from at least half of the engines that answered it.
- 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.
- The Opportunity score is
(1 - ownMentionRate) * competitorCount * engineCoverage, whereengineCoverageis the number of engines that answered. Gaps are sorted by opportunity, highest first, and shown as a five-step meter.
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 with402 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.
Approve and follow the run
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.
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.