---
title: "Takedowns and trader rules"
url: /trust/obligations
---

# Takedowns and trader rules

> What a Content or Marketplace product owes the people it publishes for: notice and takedown, counter-notice, repeat infringers, trader checks and disclosures.

A Content or Marketplace product publishes what others send it, so it runs notice and takedown, and checks each trader before a consumer buys.

```mermaid title="An item under a takedown notice"
stateDiagram-v2
  [*] --> published: an item, live
  published --> noticed: a takedown notice
  noticed --> down: upheld
  noticed --> published: rejected
  down --> countered: a counter-notice
  countered --> restored: window passes
  countered --> removed: in court
```

## A notice, from the form to the last appeal
Anyone may send a takedown notice about any item. Every step after it is a Verb with a deadline and a record.

| When | Who acts | What happens |
| --- | --- | --- |
| Day 0 | The claimant | Sends `POST /notices`, or the form on the landing site: who they are, the right claimed, the item, and a signed statement of good faith. A receipt comes back |
| Within `notices.act` | A person on your team | Takes the item down or rejects the notice. Your operator agent drafts the decision; a person signs it |
| The same day | Both parties | A statement of reasons each: what was done, on what ground, and how to answer |
| From then on | A reader | 451 [`taken_down`](/reference.md#taken_down) with the statement, never a bare 404; the uploader can still read its own item |
| Any time after | The uploader | Sends a counter-notice in one step, in the portal or over the API |
| After `notices.restore` | The product | Restores the item, unless the claimant shows a legal action filed |
| Within `notices.appeal` | Either party | Appeals, and a person who did not decide the first time decides it |

Each upheld takedown is a strike on the uploader's account, lapsing after a year; `notices.strikes` within a year closes it as a repeat infringer. A claimant whose notices are rejected three times in a row waits for a person before anything of its next comes down.

A member's post in a space moves through the same steps as any item, beside [moderation](/patterns/content.md#items). Every notice, decision, counter-notice and appeal is kept, and the landing site prints a yearly count of each.

## A trader, before and after its first sale
A [supplier](/patterns/marketplace.md#suppliers) that sells as a business is a trader, checked before its items go on sale.

A trader is named wherever a consumer meets one.

- **Before the first sale.** `traders.verify` checks name, address, phone, email, a registration number, a tax number and a bank account against evidence.
- **On every item.** With `traders.consumers`, each item shows who sells it, the total price with every fee and tax, delivery, returns, and whom the contract is with. An agent buying for someone reads the same in each item's JSON.
- **Every year, and on each change.** `traders.recheck` runs again, and whenever a detail changes; a trader that fails is paused, with every item it sells.
- **A person, not a business.** A supplier selling as a person says so, and so does each of its items.

How the catalog orders items is said in words on the site, and each paid placement is labelled as one. Each rating says whether its rater bought the item, read from the order. Any visitor reports an item or a trader with one form, which reaches the queue a notice reaches.

### Example
The research Marketplace checks every researcher as a trader, and acts on a notice within a day.

```ts title="definition.ts"
import { define } from 'apis.dev'

/** Company research from checked researchers, ordered in one call and paid when you accept it. */
export default define({
  name: 'research', domain: 'research.apis.dev',
  Researcher: {
    supplier: { verify: ['identity', 'tax'], payout: 'stripe' },
    name: 'string', lookups: '<-Lookup.researcher',
  },
  Lookup: {
    researcher: '->Researcher.lookups', orders: '<-Order.lookup',
    title: 'string', days: 'number', price: 'decimal(8,2)',
    status: { publish: [], pause: 'published', resume: 'paused' },
  },
  Order: {
    lookup: '->Lookup.orders', company: 'url', answer: 'string?',
    status: {
      place: { match: ['rating', 'price'], claimWithin: '4h' },
      claim: { in: 'placed', role: 'researcher' },
      fill:  { in: 'claimed', role: 'researcher' },
      accept: 'filled', contest: 'filled',
    },
  },
  notices: { act: '24h', restore: '10d', strikes: 3, appeal: '14d' },
  traders: {
    verify: ['name', 'address', 'phone', 'email', 'registration', 'bank'],
    recheck: '365d', consumers: true,               // the disclosures print on every item
  },
  offer: {
    'Lookup.publish': 0, 'Lookup.pause': 0, 'Lookup.resume': 0,
    'Order.place': { price: 'lookup.price', bounds: [10, 500], when: 'accepted',
                     accept: 'customer', acceptWithin: '5d', remedy: 'refund' },
    take: 0.15,
  },
})
```

A reader who asks for a Lookup taken down after a notice gets its statement, never a bare 404.

```http title="Response"
HTTP/1.1 451 Unavailable For Legal Reasons
Content-Type: application/problem+json
X-Cost: price=0, currency="USD"
X-Request-Id: req_7d3a91e0c4b2f8165a2e

{
  "type": "https://research.apis.dev/docs/errors#taken_down",
  "title": "Unavailable For Legal Reasons",
  "status": 451,
  "detail": "lookup_12 was taken down on 2026-10-27 after a notice.",
  "code": "taken_down",
  "instance": "/lookups/lookup_12",
  "statement": "https://research.apis.dev/notices/notice_4/statement"
}
```

The reader sent `GET https://research.apis.dev/lookups/lookup_12`. Your team decided the notice with `Notice.decide` on the [Operator plane](/trust/planes.md).

### Over a year
A notice is `received`, then `upheld` or `rejected`, then `countered`, `restored` or `final`.

A strike is `active`, then `lapsed`, or `closing` at the count. A trader is `pending`, `checked` or `paused`, then `checked` again or `removed`.