---
title: "Edit GEO Writer task content"
method: PATCH
path: "/intelligence_tasks/{id}"
tags: ["GEO Writer"]
---

# Edit GEO Writer task content

`PATCH /intelligence_tasks/{id}`

## Request

- Base URL: `https://api.llmpulse.ai/api/v1`
- URL: `https://api.llmpulse.ai/api/v1/intelligence_tasks/{id}`
- Auth: API key in header `Authorization`

Edits the text of a completed task in place. `edits` maps dotted paths into result_data (for example `title` or `sections.0.content`) to replacement text. Only string fields that already exist can change: a path that does not resolve to text, a blank `title`, a value over 20,000 characters or an empty `edits` object is rejected with ERR_INVALID_PARAM and nothing is written. Send the `result_version` you last read with the edits: when the task was regenerated since, the request is refused with ERR_STALE_CONTENT (409), nothing is written and `error.meta.result_version` holds the current token. Without `result_version` the edits apply to whatever the task holds now. Values identical to the stored text are ignored, and the response lists the paths that actually changed. The first edit keeps a copy of the generated output so POST /intelligence_tasks/{id}/revert can restore it; regenerating the task replaces the edited content. Requires a `read_write` scope API key and, for team members, update permission on GEO Writer. On a product_listing task, description_html keeps only p, ul, ol, li, strong, em, h3 and br, with no attributes: other markup is stripped, not refused, so read the stored value from the response. A revert restores the generated description cleaned the same way.

## Path parameters

- `id` string, required

## Request body

- IntelligenceTaskUpdateRequest
  - `project_id` integer, required
  - `edits` object, required: Dotted result_data paths (title, sections.0.content, key_points.2) mapped to their replacement text. Only string fields that already exist are editable; sections cannot be added or removed.
  - `result_version` string, nullable: Optional. The result_version of the task as last read. When sent, the edit is refused with ERR_STALE_CONTENT (409) and nothing is written if the task was regenerated since. Omitted, null or empty, the edits apply to whatever the task holds now

## Response `200`

Updated task with the paths that changed

- IntelligenceTaskUpdateResponse
  - `id` integer
  - `public_id` string
  - `project_id` integer
  - `task_type` string
  - `title` string
  - `status` string
  - `prompt_id` integer, nullable
  - `prompt_text` string, nullable
  - `agentic_mode` boolean
  - `custom_topic` string, nullable
  - `user_instructions` string, nullable
  - `output_language_code` string, nullable
  - `word_count` integer, nullable
  - `result_data` object, nullable: The generated content once status is completed; null before that. A product_listing task returns title, summary, description_html (p, ul, ol, li, strong, em, h3 and br only), faq (question and answer pairs), seo_title, seo_description, image_alts (image_id and alt), changes (field and reason) and labels
  - `error_message` string, nullable
  - `estimated_time` string, nullable
  - `created_at` string, date-time
  - `processed_at` string, date-time, nullable
  - `manually_edited_at` string, date-time, nullable: When the content was last edited by hand; null while the output is as generated
  - `edited_by_user_id` integer, nullable: User behind the last manual edit; null for an unedited task or an edit made from an embedded portal
  - `result_version` string: Concurrency token for content edits: send it back as result_version on PATCH /intelligence_tasks/{id} so an edit composed before a regeneration is refused with ERR_STALE_CONTENT (409). It is "0" until the task first completes, then changes each time a generation or regeneration replaces result_data, never on a manual edit or a revert. Treat it as opaque text
  - `request_id` string
  - `changed_paths` string[]: Paths whose text actually changed; empty when every value matched the stored text

## Other responses

- `403`: API key lacks write permission
- `404`: Resource not found
- `409`: The task was regenerated since the result_version in the request was read (ERR_STALE_CONTENT). Nothing was written; error.meta.result_version holds the current token. Read the task again and resend the edits
- `422`: Invalid parameters

## Changes

- **2026-10-11** `82f2d44c22e5`: 1 info
  - added the non-success response with the status `409`
- **2026-09-10** `4f310b3cc790`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/llmpulse/apis/llm-pulse-api/changes/intelligence_tasks/:id/patch.md)

---

[API](https://skmtc.dev/llmpulse/apis/llm-pulse-api.md) - [All operations](https://skmtc.dev/llmpulse/apis/llm-pulse-api/llms.txt) - [OpenAPI document](https://skmtc.dev/llmpulse/apis/llm-pulse-api/revisions/38a31f123641?raw)
