The shared model
These invariants hold across every surface:- Nothing auto-applies. Submissions create pending review items; Arcmira reviewers accept as submitted, accept with changes, resolve differently, or reject. Transcript corrections are additionally optimistic for you: your own pending edits ride back on your transcript reads immediately.
- Free. Feedback and corrections cost 0 rows, always.
- Access follows the surface. You can review what your key can read: commercial types need Pro+ and
recommendations:read; everything else needsread. - Reproducible. Every submission carries either the
querythat produced the result (Search family) or a positional anchor (video_id+revision+ content hash, transcripts). Reviewers replay what you saw. - Targeted. Corrections point at stable public IDs from the response:
ent_*,men_*,com_*, segment anchors. Notes-only is fine; untyped is not. - Withdrawable. Pending submissions are deletable by their author.
- Retry-safe.
Idempotency-Keyis supported everywhere; replays returnIdempotency-Replayed: true. - Reputation accrues to the submitting account and key over time. High-quality submitters may move through faster review paths; scope alone never grants automatic acceptance.
Search surfaces
Pick thetype matching the surface you called (all submissions are logged for review):
The envelope:
type, the reproducing query (required), optional request context, and up to 100 corrections:
Issue types (entity-family corrections)
Reason codes (commercial corrections)
Commercial corrections (recommendations, channel_sponsors) target rows by com_* (or sponsor ent_*) and carry the new mention_class plus a reason:
Worked commercial example (a creator disputing a false paid read):
Passing query
The request merges query from three sources: a URL ?query= parameter (URL-encoded JSON), the JSON body’s query object (overrides ?query= on key conflicts), and loose query-string params (anything besides type and query, filling only keys the other two did not set). Prefer the body form. An empty query returns 400 invalid_feedback_request.
Monitor alerts
Alert feedback targets a fired alert, not the monitor’s configuration (fix configuration withPATCH /v1/monitors/{id}). One matched appearance can produce multiple delivery rows (email + Slack + webhook), so content disputes key off the occurrence, and only delivery problems key off the delivery row. Alert rows carry mention_id (men_*) so you can pivot to the mention surface without joins.
false_positive_alert (should not have fired), wrong_entity, wrong_media, wrong_timestamp, duplicate_alert, missed_alert, delivery_issue (the one delivery-row case: wrong channel, not received; suggested_change: { "channel": ... }), other.
missed_alert is an expectation: there is no row to target, so the correction carries evidence instead: suggested_change: { "source_url": "https://youtube.com/watch?v=...", "approximate_timestamp_seconds": 532, "entity_id": "ent_123881" }.
Referenced alert rows must belong to your account; unknown or foreign IDs return 404 alert_not_found.
Transcripts
Transcript content review runs through the corrections route, not/v1/feedback, because it needs revision and anchor semantics rather than a query replay. Six kinds on POST /v1/videos/{video_id}/corrections:
Full payloads, the djb2 anchor hash, the
seq queue contract (409 re-anchor / 412 expectedSeq), and withdrawal routes live in Transcripts for coding agents.
Response shape
feedback_id in support threads. Public submissions always return per-item status: "logged"; the applied / unchanged / failed counters exist for reviewer tooling and stay 0 on the public path.
Readback
Check where a submission stands withGET /v1/feedback/{feedback_id} (scope read; only the submitting user’s keys can read it, and unknown or foreign IDs return 404 feedback_not_found):
pending_review, needs_information, accepted, accepted_with_changes (accepted, but the reviewer changed or re-routed the final resolution), rejected, withdrawn, applied (the accepted change is live; accepted ≠ applied), reverted.
Agent guidance
- Always include the surface-matching
typeand the reproducingquery. - Include
endpoint,method, andrequest_idwhen you have them. - Target rows by their public IDs from the response you actually received.
- Use
suggested_changeonly when you have a concrete fix; otherwiseissue_type+notes. - Never assume application; nothing changes live data until review.
- Batch up to 100 corrections per submission, grouped by the query that produced them.
- Notes limits: 2,000 characters per correction, 4,000 on the top-level
notes. - Send
Idempotency-Keyon every submission.
Errors
A correction whose target ID doesn’t resolve (a stale
com_* or men_*) is not an error: the submission still returns 200 and the row is logged for review. Re-pull the surface if you want to confirm the ID before submitting.
See Errors for the envelope.