Common Good Industries

Clerk

Document intake for transaction back offices. Clerk reads an unstructured agreement, pulls out the fields that matter, tells you what's missing or doesn't add up, and writes the derived paperwork — the work a back office would otherwise type by hand.

Four steps, one call

Extract
labelled-pattern matching pulls buyer, seller, property, price, dates and contingencies out of the raw text
Validate
missing required fields, earnest money above the purchase price, a closing date with no possession date
Generate
a transaction summary and a closing checklist whose steps follow from the contingencies actually present
Meter
one billable unit per processed document — priced to the labor displaced, not to headcount

Deterministic first, AI only as fallback

The extraction path is pattern-based and keyless: same document, same fields, every time, with no model call and no per-document inference cost. An LLM pass can fill fields the patterns miss, but it is never required and never overrides a pattern match — so the pipeline still runs, and still tests, with no API key at all. Every field reports its source (pattern, llm, or none) and a confidence, so you always know which values a model guessed at.

Try the pipeline

/extract is open and stateless — it runs the full extract → validate → generate pass and returns everything, without storing your document or metering it.

curl -s https://clerk.forthecommongood.ai/extract \
  -H 'content-type: application/json' -d '{
    "doctype": "real_estate_purchase_agreement",
    "text": "Buyer: Dana Reyes\nSeller: Morgan Webb\nProperty Address: 118 Larimer St, Denver CO\nPurchase Price: $485,000\nEarnest Money: $10,000\nClosing Date: 2026-09-15\nContingencies: financing, inspection\nFinancing: conventional 30-year"
  }'

Returns every field with its confidence and source, the open issues, whether the document is complete, and both generated documents in Markdown.

Doctypes are schemas, not code paths

A document type is a list of field specs — name, patterns, whether it's required, how to normalize it. Adding a vertical is adding a schema, not editing the engine. Shipping today:

real_estate_purchase_agreement9 fields · 6 required

Real estate first, deliberately — it's the highest-volume transaction document with the lowest regulatory complexity. GET /doctypes/{name} returns the whole schema as data.

Endpoints

POST /extractfull pipeline, stateless
GET /doctypesavailable document types
GET /doctypes/{name}the schema, as data
GET /pricingunit price and doctype weights
GET /usage?client_id=documents, units, amount due
POST /processrun + store + meter · key
GET /extractions/{doc_id}a stored extraction