The Keyword Research API lets you read and refine the keywords behind a site's content plan. Each item is one keyword, along with the page it targets, its estimated search volume, how competitive it is, and the cluster of related keywords it belongs to.
This is the data the blog post briefs are built from. Reading it shows why a topic was chosen. Editing it steers what the next set of briefs covers.
With the Keyword Research API, you can:
The first edit to generated keyword research doesn't change it. It copies the research, and the response carries a different keywordResearchId from the one you sent.
Always send the ID from your most recent response on the next write. Sending the original ID again copies the research a second time and strands the first copy. Both Update Keyword Research Item and Bulk Update Keyword Research Items behave this way, so mixing the two against the original ID produces two separate copies.
The original research isn't deleted. The copy simply becomes the most recent one, and reads always return the most recent.
A generation that completes after your edit produces fresh research that becomes the newest. Reads then return that new research instead of your edited copy.
Compare keywordResearchId between reads to detect this. If it changed, the research was replaced and your edits are no longer what a read returns.
Only keyword and mainKeyword are writable, and both update methods are update-only. There's no way to add or delete a keyword through this API.
mainKeyword only promotes. Setting it to true makes an item its page's main keyword. Setting it to false, or leaving it out, changes nothing, so you can't demote a main keyword directly. Promote a different keyword on that page instead.
Changing keyword also refreshes that item's searchVolume and competition, because those figures describe the new keyword rather than the old one. A field mask doesn't hold them at their previous values.
It's important to note the following points before starting to code:
contentPlanFlowId on the read request is ignored.fieldMask naming at least one writable field. An omitted or empty mask is rejected.Last updated: 31 August 2026