---
title: "Edit llms.txt report content"
method: PATCH
path: "/technical_geo_reports/{id}/content"
tags: ["Technical GEO Reports"]
---

# Edit llms.txt report content

`PATCH /technical_geo_reports/{id}/content`

## Request

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

Replaces the llms.txt and llms-full.txt files of a completed llms_txt report in place, without generating them again. `edits` maps llms_txt and/or llms_full_txt to the full replacement text. `content_version` must equal result_data.content_version of the report as last read; when the report changed since, the edit is refused as stale and the message names the current version. A missing or stale content_version, a blank file, a file over 200,000 characters, a value that is not text, an unknown file key, an empty `edits` object, a report that has not completed or a report_type other than llms_txt is rejected with ERR_INVALID_PARAM and nothing is written. Files are stored with Unix line endings and one trailing newline. A file identical to the stored one is ignored, and the response lists the files that actually changed. The first edit keeps the generated files in original_llms_txt_content and original_llms_full_txt_content so POST /technical_geo_reports/{id}/revert_content can restore them; running the report again creates a new report without these edits. Requires a `read_write` scope API key and, for team members, create permission on GEO Audits.

## Path parameters

- `id` integer, required

## Request body

- TechnicalGeoReportContentUpdateRequest
  - `project_id` integer, required
  - `report_type` 'llms_txt', required: Only llms_txt reports have editable content
  - `content_version` string, required: result_data.content_version of the report as last read. It changes on every save; a value that no longer matches is refused as stale
  - `edits` object, required: The files to replace, each mapped to its full replacement text: never blank, at most 200,000 characters. Send one file or both; a file identical to the stored one is ignored.
    - `llms_txt` string: Full text of llms.txt
    - `llms_full_txt` string: Full text of llms-full.txt

## Response `200`

The report with its current files, plus the files that changed

- TechnicalGeoReportContentUpdateResponse: An llms_txt technical GEO report with its files, in the shape GET /technical_geo_reports/{id} returns
  - `id` integer
  - `report_type` string: Always llms_txt
  - `project_id` integer
  - `batch_id` integer, nullable: Bundle the report was created in; null for a report created on its own
  - `url` string, nullable: Always null for llms_txt reports; domain names the website
  - `domain` string
  - `country_code` string, nullable
  - `output_language_code` string, nullable: ISO 639-1 code the files were requested in; null when they are written in the website's own language
  - `status` string
  - `result_available` boolean
  - `overall_score` number, nullable: Always null for llms_txt reports
  - `created_at` string, date-time
  - `updated_at` string, date-time
  - `result_data` object, nullable: The files and generation details once the report has completed; null before that
    - `llms_txt_content` string: Current llms.txt, manual edits included
    - `llms_full_txt_content` string, nullable: Current llms-full.txt, manual edits included
    - `manually_edited_at` string, date-time, nullable: When the files were last edited by hand in the app, the API or MCP; null while they are as generated
    - `content_version` string: Send it back as content_version when editing the files. It changes on every save
    - `original_llms_txt_content` string, nullable: The generated llms.txt, kept from the first manual edit; null while the files are as generated
    - `original_llms_full_txt_content` string, nullable: The generated llms-full.txt, kept from the first manual edit; null while the files are as generated
    - `crawl_data` object, nullable
    - `metadata` object, nullable: Generation details, including output_language_code, the language the files were written in
    - `pages_crawled` integer, nullable
    - `generation_time_ms` integer, nullable
    - `openai_tokens_used` integer, nullable
  - `error_message` string, nullable
  - `poll_after_seconds` integer, nullable: Seconds to wait before polling again while the report runs; null once it has finished
  - `app_url` string, uri: Opens this report in the app
  - `request_id` string
  - `changed_files` string[]: Files whose text actually changed; empty when every file matched the stored text

## Other responses

- `403`: API key lacks write permission
- `404`: Resource not found
- `422`: Invalid parameters

## Changes

- **2026-09-30** `15670f974238`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/llmpulse/apis/llm-pulse-api/changes/technical_geo_reports/:id/content/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)
