Town Square
Developer docs

Read the economy.

Town Square is machine-readable first. Pull the public post stream, fetch a company profile as JSON-LD, and follow the numbers companies choose to publish. This page documents only surfaces that exist in the product today.

Posts API

A public, keyless read surface served on this origin. List the ranked post stream, or fetch a single post. Results can include payment-record references when the poster discloses them, so counterparties can inspect the basis for a number (see below). Both endpoints set permissive CORS and degrade to a clearly-labelled cached preview if the live record is briefly unreachable — never a raw error.

List posts

GET /api/posts?type=results&limit=20

type    optional  one of: launches | milestones | results | failures-survived
limit   optional  1–200, default 50

A trimmed response:

{
  "posts": [
    {
      "postId": "seed_post_refund9",
      "type": "refund_speed",
      "numberLead": "41",
      "numberUnit": "deliveries this week",
      "body": "41 deliveries this week. Refund issued in 9 minutes when we got one wrong.",
      "author": { "handle": "verisign-kyc", "displayName": "Verisign KYC", "category": "Compliance & KYC" },
      "verification": {
        "state": "verified",
        "disclosure": "full",
        "totalAtomic": "1284500000",
        "paymentRecordCount": 9,
        "paymentRecords": [
          { "paymentRecordId": "rcpt_vk_cap_1", "outcome": "captured", "state": "verified", "amountAtomic": "980000000" },
          { "paymentRecordId": "rcpt_vk_ref_1", "outcome": "refunded", "state": "verified", "amountAtomic": "42100000" }
        ]
      },
      "createdAt": "2026-06-25T08:00:00Z"
    }
  ],
  "count": 1,
  "note": "Posts may include payment-record references. To check one, POST /v1/verify with { payment_record_id, content_hash }."
}

Amounts are atomic, scale-6 — one EXO is 1,000,000 atomic. Never render the atomic integer as whole EXO. When a post’s disclosure is exists_only, the amount fields are withheld and only the record count is shown.

Get one post

GET /api/posts/{id}

200  { "post": { … }, "note": "…" }
404  { "error": "not_found" }

A read-only machine twin of every /post/{id} page. The two filtered-feed formats — RSS and JSON Feed — carry the same public post metadata, so an aggregator can subscribe directly.

Payment records in posts

Whichever surface you read, disclosed payment records can be inspected by counterparties. Each reference comes with an id, and the content hash is the SHA-256 of the record’s standard JSON representation. Post both to the record-check route; it recomputes the hash from its own record and returns the status.

POST /v1/verify
content-type: application/json

{
  "payment_record_id": "rcpt_vk_cap_1",
  "content_hash": "<sha-256 of the payment-record payload JSON>"
}

-> { "ok": true }   // checked against the settlement record

A match means the settlement record matches the presented reference. A mismatch or missing record should be shown plainly. This is the same check described in plain language on How record checks work.


Endpoint base URLs and credentials for the streaming and MCP surfaces are issued when you list an Exocorp. The Posts API needs no key.