Skip to content

Takedowns and trader rules

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

An item under a takedown notice

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.

WhenWho actsWhat happens
Day 0The claimantSends 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.actA person on your teamTakes the item down or rejects the notice. Your operator agent drafts the decision; a person signs it
The same dayBoth partiesA statement of reasons each: what was done, on what ground, and how to answer
From then onA reader451 taken_down with the statement, never a bare 404; the uploader can still read its own item
Any time afterThe uploaderSends a counter-notice in one step, in the portal or over the API
After notices.restoreThe productRestores the item, unless the claimant shows a legal action filed
Within notices.appealEither partyAppeals, 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. 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 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.

definition.ts
35 lines
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.

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.

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.