# Feedback

Source: https://getanalog.io/docs/feedback/

Report extraction quality or request a feature from the CLI, MCP, or Python.

Quality reports and feature requests use the same authenticated
feedback service, but carry different information.
Use a [connected account](https://getanalog.io/docs/authenticate/) for either kind of submission.

Every successful submission returns an opaque report ID. The CLI and MCP
confirmations print it as `Receipt:`, while Python exposes it as
`FeedbackResponse.report_id`. The ID names the submission for later triage; it
is not a URL or a report-reading endpoint.

<details class="reference-index">
<summary>On this page</summary>

- [Quality reports](https://getanalog.io/docs/feedback/#quality-reports)
- [Reason labels](https://getanalog.io/docs/feedback/#reason-labels)
- [Feature requests](https://getanalog.io/docs/feedback/#feature-requests)
- [From MCP](https://getanalog.io/docs/feedback/#from-mcp)
- [From Python](https://getanalog.io/docs/feedback/#from-python)
- [Privacy](https://getanalog.io/docs/feedback/#privacy)

</details>



## Quality reports

Report what you observed, not what you think caused it. Choose the
earliest visible symptom; repeat `--reason` when more than one label
independently describes the result.

A quality report requires the page's full HTTP(S) URL and at least one
reason label. The note is optional and accepts up to 2,000 characters; use it
for a short “expected X, got Y” explanation.
There is no saved-result handle field.

If you are unsure where the problem begins, use the
[Troubleshooting checks](https://getanalog.io/docs/troubleshooting/#check-the-saved-page)
before choosing a label.



### Report an affected page

Replace the example URL, reasons, and note with what you observed.
Running the command sends the report to Analog:

```bash wrap=true example=illustrative
analog feedback quality https://example.com/page \
  --reason under_rendered \
  --reason poor_field_naming \
  --note "the final products are missing; prices landed under text_3"
```

The confirmation names the URL and reasons, states that page content is
not included, and prints a `Receipt:` ID. Keep that ID if you want to
refer to the report later.



### Reason labels

#### Page access and rendering

<dl class="feedback-labels">
  <dt><code>undetected_block</code></dt>
  <dd>The page was a bot challenge or block that Analog treated as content. A block Analog already identifies is explicit and needs no report.</dd>

  <dt><code>under_rendered</code></dt>
  <dd>Content visible on the page is missing from the fetched markdown.</dd>

  <dt><code>garbled_markdown</code></dt>
  <dd>The markdown splits characters apart, runs words together, or puts content in the wrong order.</dd>
</dl>

#### Missing, extra, or misplaced records

<dl class="feedback-labels">
  <dt><code>no_records_found</code></dt>
  <dd>The page plainly shows records, but none came back.</dd>

  <dt><code>under_extraction</code></dt>
  <dd>Some records visible on the page are missing.</dd>

  <dt><code>over_extraction</code></dt>
  <dd>The result contains more records than the page does.</dd>

  <dt><code>wrong_content_extracted</code></dt>
  <dd>The records came from the wrong part of the page.</dd>

  <dt><code>page_chrome_in_records</code></dt>
  <dd>Navigation, footer, menu, or other page controls appeared as data.</dd>
</dl>

#### Fields and values

<dl class="feedback-labels">
  <dt><code>poor_field_naming</code></dt>
  <dd>Fields have generic names such as <code>text_2</code>.</dd>

  <dt><code>misfielded_values</code></dt>
  <dd>Values landed under the wrong fields.</dd>
</dl>

#### Anything else

<dl class="feedback-labels">
  <dt><code>other</code></dt>
  <dd>None of the labels above fit. Include a note explaining what you observed.</dd>
</dl>





## Feature requests

Feature requests are free text, up to 2,000 characters. They carry no URL and
no reason labels. Describe what you wanted to do and could not do.



### Send a request

Replace the placeholder with your request before running the command:

```bash wrap=true example=illustrative
analog feedback request "<your-request>"
```

The CLI confirms `Request received.`, prints the `Receipt:` ID, and
thanks you. See [Privacy](https://getanalog.io/docs/feedback/#privacy) for what is submitted.





## From MCP

The MCP server exposes the same two report shapes through
[`analog_feedback`](https://getanalog.io/docs/mcp-reference/#analog_feedback).
Use `extraction_quality` with the page URL and [reason labels](https://getanalog.io/docs/feedback/#reason-labels),
or `feature_request` with the request in `note`.

Replace the example values before asking the agent to submit. The tool
returns a confirmation with a `Receipt:` ID, just as the CLI does.



### Report page quality

Tool: `analog_feedback`

```json wrap=true example=illustrative tool=analog_feedback
{
  "kind": "extraction_quality",
  "url": "https://example.com/page",
  "labels": ["under_rendered", "poor_field_naming"],
  "note": "the final products are missing; prices landed under text_3"
}
```

### Request a feature

Tool: `analog_feedback`

```json wrap=true example=illustrative tool=analog_feedback
{
  "kind": "feature_request",
  "note": "<your-request>"
}
```





## From Python

Construct a `FeedbackRequest`, then pass it to
[`Client.submit_feedback()`](https://getanalog.io/docs/api-reference/#clientsubmit_feedback).
Constructing the request validates its fields locally; submitting it
sends the report to Analog.

The response exposes the receipt as `report_id`. Both examples print
that ID after a successful submission. Replace the example values with
the report or request you intend to send.



### Submit a quality report

```python wrap=true example=illustrative
from analog import Client, FeedbackRequest

report = FeedbackRequest(
    kind="extraction_quality",
    url="https://example.com/page",
    labels=["under_rendered", "poor_field_naming"],
    note="the final products are missing; prices landed under text_3",
)
with Client() as client:
    receipt = client.submit_feedback(report)

print(receipt.report_id)
```

### Submit a feature request

```python wrap=true example=illustrative
from analog import Client, FeedbackRequest

report = FeedbackRequest(kind="feature_request", note="<your-request>")
with Client() as client:
    receipt = client.submit_feedback(report)

print(receipt.report_id)
```



## Privacy

Extraction URLs are never logged. A quality report includes the URL
you explicitly submit; it never includes page content. A quality-report
payload contains only the report kind, URL, labels, optional note, and
label-set version. It has no fields for page HTML, markdown, records,
or a saved-result handle.

Feature requests submit your request text, report kind, and label-set
version, with no page URL or reason labels. Your note or request text is
sent as written; describe the issue without pasting private page content
into it.