> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gavai.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Takedowns and content reports

> How the platform handles notice, counter-notice, and the chain of evidence when content on a workspace's published app is reported.

export const PageMeta = ({audience, readingTime, prereqs, level}) => {
  const items = [audience && ({
    key: "audience",
    label: "AUDIENCE",
    value: audience
  }), readingTime && ({
    key: "time",
    label: "READ",
    value: readingTime
  }), level && ({
    key: "level",
    label: "LEVEL",
    value: level
  }), prereqs && prereqs.length > 0 && ({
    key: "prereqs",
    label: "PREREQS",
    value: prereqs.join(" · ")
  })].filter(Boolean);
  if (items.length === 0) return null;
  return <div className="gv-page-meta" role="group" aria-label="Page metadata">
      {items.map(item => <div className="gv-page-meta__item" key={item.key}>
          <span className="gv-page-meta__label">{item.label}</span>
          <span className="gv-page-meta__value">{item.value}</span>
        </div>)}
    </div>;
};

export const Def = ({term, type, defaultValue, required, children}) => <>
    <dt className="gv-def-list__term">
      <span className="gv-def-list__name">{term}</span>
      {type && <span className="gv-def-list__type">{type}</span>}
      {required && <span className="gv-def-list__required">required</span>}
      {defaultValue !== undefined && <span className="gv-def-list__default">
          default <code>{defaultValue}</code>
        </span>}
    </dt>
    <dd className="gv-def-list__description">{children}</dd>
  </>;

export const DefList = ({children}) => <dl className="gv-def-list">{children}</dl>;

export const ArrowItem = ({children}) => <li className="gv-arrow-item">
    <span className="gv-arrow-item__arrow" aria-hidden="true">{"↳︎"}</span>
    <span className="gv-arrow-item__content">{children}</span>
  </li>;

export const ArrowList = ({children}) => <ul className="gv-arrow-list">{children}</ul>;

export const BrandCard = ({eyebrow, title, href, icon, badge, cta, featured = false, horizontal = false, children}) => {
  const classes = ["gv-card", featured && "gv-card--featured", horizontal && "gv-card--horizontal"].filter(Boolean).join(" ");
  const inner = <>
      {icon && <span className="gv-card__icon" aria-hidden="true">
          <Icon icon={icon} />
        </span>}
      <div className="gv-card__main">
        {(eyebrow || badge) && <div className="gv-card__meta">
            {eyebrow && <Eyebrow label={eyebrow} tone="muted" />}
            {badge && <span className="gv-card__badge">{badge}</span>}
          </div>}
        <h3 className="gv-card__title">{title}</h3>
        {children && <div className="gv-card__body">{children}</div>}
        {cta && <span className="gv-card__cta">
            {cta}
            <svg className="gv-card__cta-arrow" viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
              <line x1="7" y1="17" x2="17" y2="7" />
              <polyline points="7 7 17 7 17 17" />
            </svg>
          </span>}
      </div>
    </>;
  return href ? <a className={classes} href={href}>
      {inner}
    </a> : <div className={classes}>{inner}</div>;
};

export const FeatureTable = ({columns, rows, featuredRow, caption, variant}) => <div className={`gv-feature-table ${variant ? `gv-feature-table--${variant}` : ""}`}>
    <table>
      {caption && <caption className="gv-feature-table__caption">{caption}</caption>}
      <thead>
        <tr>
          {columns.map(col => <th key={col.key} scope="col">
              <span className="gv-feature-table__header">{col.label}</span>
            </th>)}
        </tr>
      </thead>
      <tbody>
        {rows.map((row, i) => {
  const rowClass = [i === featuredRow ? "gv-feature-table__row--featured" : "", row.chosen ? "gv-feature-table__row--chosen" : ""].filter(Boolean).join(" ");
  return <tr key={i} className={rowClass}>
              {columns.map(col => {
    const v = row[col.key];
    if (variant === "tradeoff" && Array.isArray(v)) {
      const pill = col.key === "pros" ? "gv-feature-table__pill--pro" : col.key === "cons" ? "gv-feature-table__pill--con" : "";
      return <td key={col.key}>
                      {v.map((item, j) => <span key={j} className={`gv-feature-table__pill ${pill}`}>{item}</span>)}
                    </td>;
    }
    return <td key={col.key}>{v}</td>;
  })}
            </tr>;
})}
      </tbody>
    </table>
  </div>;

export const Eyebrow = ({label, tone = "default"}) => <div className={`gv-eyebrow gv-eyebrow--${tone}`}>
    <span className="gv-eyebrow__bar" aria-hidden="true" />
    <span className="gv-eyebrow__label">{label}</span>
  </div>;

<Eyebrow label="SECURITY" />

<PageMeta audience="Workspace owners, security reviewers, legal" readingTime="6 min" level="Reference" />

The platform hosts the apps you publish. That means we are sometimes the address a third party uses to report content — copyright complaints, abuse reports, court-ordered removal requests. This page is the reference for how those reports move through the platform: who can file one, what the workspace owner sees, what timelines apply, and how the counter-notice path works. By the end you will know what to expect if a report names your workspace, and what to do if you believe a takedown was issued against your content in error.

## Two distinct flows

Two report types reach the platform. They look similar from the outside but follow different procedures because they have different legal foundations.

<FeatureTable
  columns={[
{ key: "kind", label: "Report kind" },
{ key: "covers", label: "What it covers" },
{ key: "answer", label: "Default action when valid" }
]}
  rows={[
{
  kind: "Copyright notice",
  covers: "Specific content alleged to infringe copyright. Must identify the work and the location.",
  answer: "Temporarily disable access to the named content while the counter-notice window runs."
},
{
  kind: "Abuse report",
  covers: "Content that violates the platform's acceptable-use policy — illegal content, mass harassment, malware distribution, etc.",
  answer: "Investigation by the trust team. Removal, suspension, or no action depending on findings."
}
]}
/>

This page focuses on the copyright path because it is the one with a fixed procedure. Abuse reports follow the acceptable-use policy and are handled case by case.

## The copyright notice flow

A complete notice must identify the allegedly infringing content (URL within a workspace's published app), the work it allegedly infringes, the reporter's contact information, and a signed statement of good-faith belief. Notices missing any required element are returned to the sender unprocessed; they do not reach the workspace owner.

Once accepted, the notice moves through a short state machine:

```mermaid theme={null}
stateDiagram-v2
    [*] --> received: notice arrives
    received --> validated: required elements present
    received --> rejected: required elements missing
    validated --> disabled: content disabled, owner notified
    disabled --> counter_window: 10–14 business days
    counter_window --> restored: valid counter-notice received
    counter_window --> permanent: window elapsed, no counter
    restored --> [*]
    permanent --> [*]
```

What the workspace owner sees:

<ArrowList>
  <ArrowItem>**Immediate notification.** Email and console banner: which content was reported, by whom, with the full notice attached. The workspace's account stays serviceable; only the named content is affected.</ArrowItem>
  <ArrowItem>**The content is replaced with a notice page** at the same URL while the takedown is active. This is the platform's required posture under the safe-harbor framework; we cannot offer "leave it up while we sort it out."</ArrowItem>
  <ArrowItem>**A counter-notice option appears in the console** alongside the takedown record. If the workspace owner believes the report was filed in error or covers content they hold the rights to, the counter-notice form is how they assert that.</ArrowItem>
  <ArrowItem>**Strikes accumulate.** Repeated valid notices against the same workspace count toward a strike threshold. Hitting the threshold escalates the workspace to the trust team for a serviceability review.</ArrowItem>
</ArrowList>

## What's logged for every report

Every report — accepted or rejected, copyright or abuse — is recorded with the same evidence schema. The record is immutable once written; corrections are new records that supersede earlier ones.

<DefList>
  <Def term="ticket_id" type="string">
    Stable identifier for the report. Operators reference this number on every communication; the workspace owner sees it in the console.
  </Def>

  <Def term="report_kind" type="enum">
    `copyright_notice`, `copyright_counter_notice`, `abuse_report`, `court_order`.
  </Def>

  <Def term="content_locator" type="string">
    The URL or content id within a workspace's published surface that the report targets. Workspace-scoped — a single report cannot target multiple workspaces.
  </Def>

  <Def term="reporter" type="object">
    Name, organization, contact email, and address as provided. Stored verbatim — the platform does not edit or normalize what a reporter submitted.
  </Def>

  <Def term="evidence_hash" type="hash">
    SHA-256 of the canonical evidence bundle (the notice text plus attached exhibits). Used to verify integrity if the report is later referenced in correspondence.
  </Def>

  <Def term="state_transitions" type="array">
    Append-only log of state changes with timestamps and the principal responsible for each. The hash-chain root covers this array, so a tampered entry breaks verification of every later one.
  </Def>
</DefList>

A workspace owner can read the records for reports against their workspace. The platform retains them indefinitely for legal and audit purposes — they are not subject to the workspace's retention settings.

## The counter-notice path

If the workspace owner believes the disabled content was disabled in error, they can file a counter-notice. The counter-notice must identify the disabled content, state under penalty of perjury that the disabling was a mistake or misidentification, and consent to the jurisdiction of the appropriate court.

Once a valid counter-notice is filed:

<ArrowList>
  <ArrowItem>**The platform forwards it to the original reporter** with the workspace owner's contact information. This is required under the safe-harbor framework; the workspace owner cannot remain anonymous.</ArrowItem>
  <ArrowItem>**A 10-business-day wait runs.** During this time, the original reporter may notify the platform that they have filed suit. If they do, the disabled content stays disabled pending the court's decision.</ArrowItem>
  <ArrowItem>**If no suit notification arrives by the deadline, the content is restored.** The original takedown record is marked `counter_resolved` and the content is served again at the original URL.</ArrowItem>
</ArrowList>

## Misrepresentation

A reporter or counter-noticer who knowingly submits a false statement may be liable for damages under the relevant copyright framework. The platform does not adjudicate misrepresentation claims — those are between the parties — but the evidence chain we retain is the record the parties or a court will reference.

The practical consequence: file truthful reports and truthful counter-notices. The evidence bundle is preserved and your statement is part of it permanently.

## Court orders and law enforcement requests

Court orders take a different path. They are reviewed by the trust team for facial validity (correct jurisdiction, signed by the issuing authority, names content the platform can identify). If valid, the workspace owner is notified unless the order specifically prohibits notification, and the action ordered is carried out within the order's timeline.

We do not pre-emptively remove content in response to law enforcement *requests* that are not orders. A request without an order goes back to the requester with an explanation of the order we would need.

## What stays accessible during a takedown

Only the named content is affected. Specifically:

<ArrowList>
  <ArrowItem>**The workspace's other pages stay live.** A takedown against `acme.gavai.app/article-42` does not affect `acme.gavai.app/pricing`.</ArrowItem>
  <ArrowItem>**Capabilities still dispatch.** Payments, emails, and queries on unrelated pages continue.</ArrowItem>
  <ArrowItem>**The Builder remains accessible.** Operators can keep working on the rest of the app; only the disabled content path is locked from edits.</ArrowItem>
  <ArrowItem>**Audit and billing continue normally.** A takedown does not change the workspace's billing state or audit retention.</ArrowItem>
</ArrowList>

## Where to file a report

Reporters: send to the address published in the platform's [acceptable use policy](https://gavai.io/aup). Notices that arrive through support channels are routed to the same intake; we do not have an in-app reporting form because reporters are typically not workspace users.

Workspace owners: counter-notices are filed from the takedown record in the console. There is no API for filing one — the form collects the statement under penalty of perjury that the counter-notice procedure requires.

## Related

<Columns cols={2}>
  <BrandCard eyebrow="POLICY" title="Acceptable use policy" href="https://gavai.io/aup" icon="file-text">
    The behavioral policy that abuse reports are measured against.
  </BrandCard>

  <BrandCard eyebrow="SECURITY" title="Reporting vulnerabilities" href="/security/disclosure" icon="shield-exclamation">
    Coordinated disclosure for security issues — a different surface from content reports.
  </BrandCard>

  <BrandCard eyebrow="REFERENCE" title="Audit log" href="/api-reference/resources/logs" icon="list">
    Where takedown state transitions appear in a workspace's audit history.
  </BrandCard>

  <BrandCard eyebrow="CLI" title="DMCA workflow command" href="/cli/commands/dmca" icon="terminal">
    Tools for operators handling a high volume of reports.
  </BrandCard>
</Columns>
