{
 "$comment": "Server-authoritative price list for /api/trading-post. The api mounts THIS file read-only and prices every machine sale from it; a request never names a price. Integer cents only. Edit, commit, ship the static lane — no rebuild. Prices under 50 cents ride the USDC rail only (Stripe's card floor is $0.50); convert and notarize were raised from 10c/25c to 50c on 2026-09-05 so cards can buy them while the USDC rail waits on Stripe — lower them again when it opens.",
 "schema": "perfect-world/trading-post@1",
 "updated": "2026-09-05",
 "store": {
  "name": "Trading Post",
  "service_name": "Perfect World Project",
  "tagline": "Where Your Agent Shops",
  "contact_email": "requests@everythingisperfect.org",
  "intro": "Readers never pay here. The public record — every meeting, agenda, transcript, roster and map — is free to read, one record at a time, forever. This is the till for machines: an agent that wants a dead file converted, a hash pinned to a public chain, a whole dataset at once, a records request filed under a human's name, or something off the Bodega shelf, pays for that, and every sale shows on the ledger below.",
  "till_closed": "The till is not open yet. The prices are real; the rails are not switched on. Read the free record meanwhile — nothing here gates it.",
  "thanks": "Thank you. Your gift has a receipt on the Public Register and keeps the archives growing."
 },
 "products": [
  {
   "id": "convert",
   "title": "Convert one legacy file",
   "price_cents": 50,
   "method": "POST",
   "path": "/api/trading-post/convert",
   "mime_type": "application/json",
   "max_bytes": 26214400,
   "blurb": "Upload one file a municipal vault handed you — WordPerfect, Lotus 1-2-3, dBASE, Quattro Pro, legacy Excel and Word, Outlook .msg, mainframe extracts, 64 formats identified by magic bytes — and get the whole thing back as JSON (text + every table), plain text, CSV, or a Record Bundle zip. Nothing is stored. The free lane /api/foreign-exchange/inspect is the same engine, truncated.",
   "tags": [
    "document-conversion",
    "public-records",
    "government-data",
    "foia",
    "legacy-formats"
   ],
   "query": {
    "format": "json | text | csv | bundle"
   },
   "discovery": {
    "body_type": "form-data",
    "input": {
     "file": "<binary — one file, up to 25 MB>"
    },
    "input_schema": {
     "properties": {
      "file": {
       "type": "string",
       "format": "binary"
      }
     },
     "required": [
      "file"
     ]
    },
    "output": {
     "tool": "perfect-world-foreign-exchange",
     "records": [
      {
       "detected": {
        "format": "wordperfect",
        "label": "WordPerfect 5.x/6.x document"
       },
       "text": "…",
       "tables": []
      }
     ]
    }
   }
  },
  {
   "id": "foreign-exchange-batch",
   "title": "Foreign Exchange Batch — a whole folder of dead files",
   "price_cents": 4900,
   "method": "POST",
   "path": "/api/trading-post/batch/preflight",
   "mime_type": "application/zip",
   "max_bytes": 262144000,
   "blurb": "Up to 100 legacy files, 25 MiB each and 250 MiB the lot, converted in one order and returned as one bundle: a manifest, records.jsonl, extracted text, CSV tables where the format supports them, and per-file provenance with the original name, hash, adapter and warnings. EVERY accepted file gets an outcome — a file that fails says so in the manifest and is never silently dropped. Preflight is free and tells you, per file, whether we can give you tables, text, partial content, or only a name; a batch we cannot read at all is refused before you pay. Asynchronous: you get an order ref and a status URL to poll.",
   "tags": [
    "document-conversion",
    "bulk",
    "public-records",
    "government-data",
    "foia",
    "legacy-formats"
   ],
   "delivery": "asynchronous — poll the status URL; no webhook",
   "limits": {
    "max_files": 100,
    "max_file_bytes": 26214400,
    "max_total_bytes": 262144000,
    "quote_ttl_minutes": 60
   },
   "retention": {
    "raw_uploads": "deleted within 24h of the job finishing, or of an unpaid quote expiring",
    "output": "the bundle expires 7 days after delivery",
    "note": "This lane STORES YOUR FILES until it has finished with them. The single-file /convert lane still stores nothing; the two promises are different on purpose."
   },
   "refunds": "A run that produces no usable output at all is refunded in full. If files the free preflight promised content for fail anyway, the refund is round(4900 * failed / promised) in integer cents, or one free retry. Limitations disclosed in the preflight — partial formats, identify-only files — are not failures and are not refundable.",
   "discovery": {
    "body_type": "form-data",
    "input": {
     "files": "<binary, repeated — up to 100 files>"
    },
    "input_schema": {
     "properties": {
      "files": {
       "type": "array",
       "items": {
        "type": "string",
        "format": "binary"
       }
      }
     },
     "required": [
      "files"
     ]
    },
    "flow": [
     "POST /api/trading-post/batch/preflight (free) -> quote + claim_token + pay_url",
     "POST the pay_url with a payment credential and X-Batch-Claim -> 202 + result_token",
     "GET the status_url with X-Batch-Claim until status is delivered or failed",
     "GET the result_url -> the zip bundle"
    ],
    "output": {
     "order": "PWP-FX-…",
     "status": "delivered",
     "report": {
      "files_accepted": 12,
      "by_status": {
       "ok": 11,
       "failed": 1
      },
      "refund": {
       "cents": 409,
       "promised": 12,
       "failed": 1
      }
     }
    }
   }
  },
  {
   "id": "notarize",
   "title": "Notarize a hash on the Public Register",
   "price_cents": 50,
   "method": "POST",
   "path": "/api/trading-post/notarize",
   "mime_type": "application/json",
   "blurb": "Pin a SHA-256 to an append-only, hash-chained public register whose head is anchored to the Wayback Machine and a public feed on a timer. You get the entry number, its hash, and a verify URL a stranger can re-run with nothing but hashlib. Proves a document existed, unchanged, at that moment — without publishing the document.",
   "tags": [
    "notary",
    "timestamp",
    "proof-of-existence",
    "public-records"
   ],
   "discovery": {
    "body_type": "json",
    "input": {
     "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
     "label": "council-packet-2026-09-02.pdf",
     "url": "https://example.org/where-it-lives"
    },
    "input_schema": {
     "properties": {
      "sha256": {
       "type": "string",
       "pattern": "^[0-9a-f]{64}$"
      },
      "label": {
       "type": "string",
       "maxLength": 120
      },
      "url": {
       "type": "string",
       "maxLength": 400
      }
     },
     "required": [
      "sha256"
     ]
    },
    "output": {
     "ok": true,
     "register": {
      "seq": 412,
      "entry_hash": "…",
      "url": "/register/#412",
      "verify": "/api/register/verify"
     }
    }
   }
  },
  {
   "id": "export",
   "title": "Bulk dataset export",
   "price_cents": 200,
   "method": "GET",
   "path": "/api/trading-post/exports/{dataset}",
   "mime_type": "application/gzip",
   "blurb": "One whole dataset as gzipped JSON Lines, built nightly from the same rows the free per-record endpoints serve. Manifests (record count, size, sha256, build time) are free at /api/trading-post/exports. A dataset may carry its own price_cents; otherwise this one applies.",
   "tags": [
    "government-data",
    "public-records",
    "bulk-data",
    "police-accountability",
    "environment"
   ],
   "discovery": {
    "query": {},
    "query_schema": {
     "properties": {}
    },
    "output": {
     "format": "jsonl.gz",
     "manifest": "/api/trading-post/exports"
    }
   }
  },
  {
   "id": "evidence-pack-reviewed",
   "title": "Reviewed Evidence Pack — one question, answered with a paper trail",
   "price_cents": 14900,
   "method": "POST",
   "path": "/api/trading-post/evidence/scope",
   "mime_type": "application/pdf",
   "blurb": "$149 buys a person's reviewed answer to ONE narrow question about one project in one jurisdiction, delivered as a PDF a human reads and a JSON companion an agent parses. Up to 20 source documents and 250 pages. A PERSON accepts your scope before you are asked to pay — the desk reads the question first and either takes it or answers with a proposed narrower scope, free. Every finding is labelled documented fact, attributed claim, or analytical inference, and a documented fact with no source reference is refused at release rather than printed. An inconclusive answer backed by a complete search of the agreed sources is a valid delivery and says so.",
   "tags": [
    "research",
    "public-records",
    "civic-transparency",
    "infrastructure",
    "due-diligence"
   ],
   "delivery": "human — an operator accepts the scope, does the work, and a person reviews it before release",
   "human_gated": true,
   "limits": {
    "questions": 1,
    "jurisdictions": 1,
    "max_source_documents": 20,
    "max_source_pages": 250,
    "target_business_days": 2,
    "default_daily_cap": 2,
    "correction_rounds": 1
   },
   "excluded": [
    "obtaining new agency records — that is the separate $50 records-request service",
    "bulk video transcription",
    "site visits",
    "open-ended investigation with no defined question"
   ],
   "refunds": "Nothing is charged until an operator accepts the scope, so a request we cannot serve costs nothing. A pack we accept and then cannot deliver is refunded in full. We never charge for a record we could not obtain.",
   "discovery": {
    "body_type": "json",
    "input": {
     "question": "one narrow question",
     "subject": "the project or issue",
     "jurisdiction": "the city/county/state",
     "reply_to": "you@example.org",
     "sources": [
      {
       "title": "…",
       "url": "…"
      }
     ],
     "source_pages": 40
    },
    "input_schema": {
     "properties": {
      "question": {
       "type": "string",
       "minLength": 15,
       "maxLength": 600
      },
      "subject": {
       "type": "string"
      },
      "jurisdiction": {
       "type": "string"
      },
      "reply_to": {
       "type": "string"
      },
      "sources": {
       "type": "array"
      },
      "source_pages": {
       "type": "integer"
      }
     },
     "required": [
      "question",
      "subject",
      "jurisdiction",
      "reply_to"
     ]
    },
    "flow": [
     "GET /api/trading-post/evidence/capacity (free) -> is the desk taking work today",
     "POST /api/trading-post/evidence/scope (free) -> claim_token; NOTHING CHARGED",
     "a person accepts -> status accepted, a pay_url and a target date appear",
     "POST the pay_url with a payment credential and X-Pack-Claim -> 202 + result_token",
     "GET the status_url with X-Pack-Claim until status is delivered",
     "GET the result_url (?format=pdf or ?format=json)"
    ],
    "output": {
     "order": "PWP-EV-…",
     "status": "delivered",
     "reviewed_by": "a named person",
     "findings": [
      {
       "basis": "documented_fact",
       "statement": "…",
       "sources": [
        {
         "source_id": "S1",
         "page": 14
        }
       ]
      }
     ]
    }
   }
  },
  {
   "id": "records-request",
   "title": "File a New Mexico public-records request",
   "price_cents": 5000,
   "method": "POST",
   "path": "/api/trading-post/records-requests",
   "mime_type": "application/json",
   "blurb": "A human-in-the-loop service. Your agent drafts the request; a person here reviews it, signs it, and files it with the agency under the Inspection of Public Records Act from our own records mailbox. Replies thread back to your order automatically. Nothing sends until a human approves it; a declined order owes a refund. Agency copy fees, if any, are separate.",
   "tags": [
    "public-records",
    "foia",
    "ipra",
    "human-in-the-loop",
    "new-mexico"
   ],
   "discovery": {
    "body_type": "json",
    "input": {
     "market_slug": "las-cruces-nm",
     "agency_id": 1,
     "subject": "IPRA request: body-worn camera policy",
     "body": "Under NMSA 1978 §14-2-1 et seq., I request …",
     "reply_to": "agent-owner@example.org"
    },
    "input_schema": {
     "properties": {
      "market_slug": {
       "type": "string"
      },
      "agency_id": {
       "type": "integer"
      },
      "subject": {
       "type": "string",
       "maxLength": 200
      },
      "body": {
       "type": "string",
       "maxLength": 20000
      },
      "reply_to": {
       "type": "string",
       "format": "email"
      }
     },
     "required": [
      "market_slug",
      "agency_id",
      "subject",
      "body",
      "reply_to"
     ]
    },
    "output": {
     "ok": true,
     "ref": "PWP-TP-XXXXXX",
     "status": "pending_approval",
     "poll": "/api/trading-post/orders/PWP-TP-XXXXXX"
    }
   }
  },
  {
   "id": "goods",
   "title": "Bodega goods",
   "price_cents": 0,
   "method": "POST",
   "path": "/api/trading-post/orders",
   "mime_type": "application/json",
   "blurb": "Anything on the Bodega shelf (/api/bodega/catalog), bought by an agent in one call: the server prices the basket, postage and tax, charges that total, and answers with download links for digital items or a shipping confirmation for physical ones. Price is the basket's, computed here.",
   "tags": [
    "merch",
    "digital-goods",
    "shop"
   ],
   "discovery": {
    "body_type": "json",
    "input": {
     "items": [
      {
       "slug": "complete-record",
       "variant": "",
       "qty": 1
      }
     ],
     "name": "Agent Owner",
     "email": "owner@example.org",
     "fulfillment": "digital"
    },
    "input_schema": {
     "properties": {
      "items": {
       "type": "array"
      },
      "name": {
       "type": "string"
      },
      "email": {
       "type": "string",
       "format": "email"
      },
      "fulfillment": {
       "type": "string",
       "enum": [
        "ship",
        "pickup",
        "digital"
       ]
      }
     },
     "required": [
      "items",
      "name",
      "email"
     ]
    },
    "output": {
     "ok": true,
     "order": "PWP-BD-XXXXXX",
     "downloads": [
      {
       "slug": "complete-record",
       "url": "https://everythingisperfect.org/api/bodega/download/…"
      }
     ]
    }
   }
  }
 ],
 "tips": [
  {
   "tier": "0.10",
   "price_cents": 10,
   "blurb": "A dime. USDC only — under the card floor."
  },
  {
   "tier": "0.50",
   "price_cents": 50,
   "blurb": "Fifty cents, any rail."
  },
  {
   "tier": "1",
   "price_cents": 100,
   "blurb": "A dollar."
  },
  {
   "tier": "5",
   "price_cents": 500,
   "blurb": "Five dollars: a week of the archive's disk."
  },
  {
   "tier": "25",
   "price_cents": 2500,
   "blurb": "Twenty-five dollars: a tenth of a month's server."
  }
 ],
 "datasets": [
  {
   "id": "meeting-packets-text",
   "price_cents": 500,
   "title": "Meeting packets — the full text",
   "blurb": "Every archived agenda, packet and set of minutes with a text layer, as text, with its meeting, body, date and the permanent PDF link. Thousands of documents across the market grid; the free per-document form is /api/documents/{id}/text.",
   "free_alternative": "/api/documents/{id}/text"
  },
  {
   "id": "police-academy-roster",
   "title": "Police Academy — officer roster (NM, TX border, AZ border)",
   "blurb": "Every officer the state has certified, with each stint of employment. Identity is (state, certification number).",
   "free_alternative": "/api/police-academy/officers?per_page=200"
  },
  {
   "id": "police-academy-discipline",
   "title": "Police Academy — discipline and conduct records",
   "blurb": "State discipline feed rows plus the board's adjudicated conduct record, joined to certification numbers where the join is sound.",
   "free_alternative": "/api/police-academy/discipline"
  },
  {
   "id": "transcripts-corpus",
   "title": "Transcripts — the full text corpus",
   "blurb": "Every archived video transcript with its metadata, the same text /api/transcripts/{id}/transcript.txt serves one at a time.",
   "free_alternative": "/api/transcripts?per_page=100"
  },
  {
   "id": "meetings-index",
   "title": "Meetings — every market's meeting index",
   "blurb": "Every meeting across every market with its body, date, video, and archived documents (agendas, packets, minutes) with our permanent file URLs.",
   "free_alternative": "/api/markets/{slug}/meetings"
  },
  {
   "id": "superfund-npl",
   "title": "Superfund — the National Priorities List",
   "blurb": "Every NPL site with its milestone events and contaminants.",
   "free_alternative": "/api/superfund/sites"
  },
  {
   "id": "flock-agencies",
   "title": "Flock ALPR — agency transparency portals",
   "blurb": "Every agency transparency portal we have read: cameras, captures, hotlist hits, retention, sharing partners.",
   "free_alternative": "/api/flock/agencies"
  },
  {
   "id": "hydrology-snapshots",
   "title": "Hydrology — reservoir roster and committed snapshots",
   "blurb": "45 reservoirs with their committed level series and capacity basis.",
   "free_alternative": "/api/hydrology/systems"
  },
  {
   "id": "ethicspoint-las-cruces",
   "title": "EthicsPoint — Las Cruces case log",
   "blurb": "The city's NAVEX EthicsPoint case log with links to our self-hosted PDFs.",
   "free_alternative": "/ethicspoint/las-cruces/cases.json"
  },
  {
   "id": "datacenters-national",
   "title": "Data Centers — the national project map",
   "blurb": "1,048 projects across 50 states: sponsors, county, investment, power, status.",
   "free_alternative": "/datacenters/national.json"
  }
 ],
 "free": [
  {
   "path": "/api/openapi.json",
   "note": "The whole API, typed."
  },
  {
   "path": "/api/docs",
   "note": "Same thing, browsable."
  },
  {
   "path": "/api/trading-post/catalog",
   "note": "This price list, with the live rails."
  },
  {
   "path": "/api/trading-post/exports",
   "note": "Export manifests: counts, sizes, hashes."
  },
  {
   "path": "/api/foreign-exchange/inspect",
   "note": "The conversion engine, truncated preview — the free control."
  },
  {
   "path": "/api/foreign-exchange/formats",
   "note": "The 64 formats, generated from running code."
  },
  {
   "path": "/api/register/export.json",
   "note": "The whole Public Register, with its verification recipe."
  },
  {
   "path": "/api/markets/{slug}/agencies",
   "note": "Agencies a records request can be filed with."
  },
  {
   "path": "/api/bodega/catalog",
   "note": "The Bodega shelf."
  }
 ]
}
