Skip to content

For developers & agents

A closing timeline built to be called by AI agents

An agent running a real-estate workflow needs a contract read with a citation and calendar arithmetic that is correct on a holiday. Neither is something a language model does reliably on its own. Contract10 exposes the same engine behind the site as a REST API and a hosted MCP server, so an agent calls a tool instead of guessing at a PDF or a calendar.

Quickstart

No key, no signup, one call

POST /timeline is free and keyless because determinism should not be behind a paywall. Send the fields you know, get back every deadline with its derivation.

request

curl -X POST https://www.contract10.com/api/v1/timeline \
  -H "Content-Type: application/json" \
  -d '{"fields":[{"key":"acceptance_date","value":"2026-08-28"},{"key":"closing_days","value":"30"},{"key":"earnest_money_days","value":"3"},{"key":"inspection_period_days","value":"10"},{"key":"final_walkthrough_days","value":"3"}]}'

response 200

{
  "data": {
    "acceptanceDate": "2026-08-28",
    "closingDate": "2026-09-28",
    "deadlines": [
      {
        "key": "earnest_money",
        "label": "Earnest money due",
        "dueDate": "2026-09-02",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-28",
        "offsetDays": 3,
        "dayBasis": "business",
        "rollRule": "forward",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Aug 28, 2026 (acceptance) plus 3 business days = Sep 2, 2026. Deposit must be delivered to escrow.",
        "sourceField": "earnest_money_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "money"
      },
      {
        "key": "inspection",
        "label": "Inspection period ends",
        "dueDate": "2026-09-08",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-28",
        "offsetDays": 10,
        "dayBasis": "calendar",
        "rollRule": "forward",
        "rolledFrom": "2026-09-07",
        "rolledReason": "Labor Day",
        "derivation": "Aug 28, 2026 (acceptance) plus 10 calendar days = Sep 7, 2026. That is Labor Day, so it moves to Sep 8, 2026. Last day to complete inspections.",
        "sourceField": "inspection_period_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "diligence"
      },
      {
        "key": "final_walkthrough",
        "label": "Final walkthrough",
        "dueDate": "2026-09-25",
        "baseKey": "closing_date",
        "baseDate": "2026-09-28",
        "offsetDays": -3,
        "dayBasis": "calendar",
        "rollRule": "backward",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Sep 28, 2026 (closing) minus 3 calendar days = Sep 25, 2026. Buyer's final walkthrough before signing.",
        "sourceField": "final_walkthrough_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "closing"
      },
      {
        "key": "closing",
        "label": "Closing",
        "dueDate": "2026-09-28",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-28",
        "offsetDays": 30,
        "dayBasis": "calendar",
        "rollRule": "forward",
        "rolledFrom": "2026-09-27",
        "rolledReason": "a Sunday",
        "derivation": "Aug 28, 2026 (acceptance) plus 30 calendar days = Sep 27, 2026. That is a Sunday, so it moves to Sep 28, 2026. Closing / settlement.",
        "sourceField": "closing_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "closing"
      }
    ],
    "warnings": [],
    "holidaysInWindow": [
      {
        "date": "2026-09-07",
        "name": "Labor Day"
      }
    ],
    "engineVersion": "1.0.0"
  }
}

This is the real response: closing rolled off a Sunday to Monday, and inspection rolled off Labor Day, both computed, not hand-typed. Extraction (reading these fields off a real PDF instead of typing them) is POST /extract, and that one needs a key.

Built for agents

What an agent actually needs from this API

Two things a model can't do reliably

A language model can read a PDF and it can add numbers, but it will misread a smudged "17" as "1" and it will get calendar arithmetic wrong across a holiday. Contract10 does the citation and the arithmetic, deterministically, so your agent doesn't have to trust its own guess.

Single-key auth

One API key unlocks the REST API and the MCP server. Authorization: Bearer c10_live_... or c10_test_.... No OAuth dance, no per-endpoint credentials.

Machine-readable docs

A full reference, a spec at /api/openapi, and a plain-text summary at /llms.txt so an agent can onboard itself without a human reading a page first.

Deterministic where it counts

POST /timeline is pure arithmetic: same fields in, same dates out, every time, no model in the loop. POST /extract does use a model, so it returns a confidence and a page citation per field, and a low-confidence field renders as needsVerify rather than a silent guess.

Safe by default

Anonymous calls to /timeline work for a dry run, throttled to 4/min and 20/day per IP. A free c10_test_ key raises that to 10/min against the real engine and never bills, so an agent loop can't run up a surprise bill while you're still building.

Citations and derivations on every call

Every extracted field returns its page and a verbatim quote. Every computed deadline returns baseDate, offsetDays, dayBasis, rollRule and a plain-English derivation, the same string a coordinator would write in the margin.

REST API

Every endpoint

Base URL https://www.contract10.com/api/v1. Bearer token: `Authorization: Bearer c10_live_...` or `c10_test_...`. /timeline and /pricing work with no key at all (anonymous, throttled). Everything else requires a key.

POST

/api/v1/timeline

Key optional

The deterministic half. Fields in, every downstream deadline out, each one showing its base date, offset, day-counting basis, weekend/holiday roll and a plain-English derivation. Pure arithmetic, no model in the loop, keyless.

request

curl -X POST https://www.contract10.com/api/v1/timeline \
  -H "Content-Type: application/json" \
  -d '{"fields":[{"key":"acceptance_date","value":"2026-08-28"},{"key":"closing_days","value":"30"},{"key":"earnest_money_days","value":"3"},{"key":"inspection_period_days","value":"10"},{"key":"final_walkthrough_days","value":"3"}]}'
POST

/api/v1/extract

Requires a live key

Contract PDF in, page-cited fields out. This half DOES use a model, so every field carries a confidence and a page citation, and a low-confidence field is surfaced as needsVerify rather than hidden. Requires a key.

request

curl -X POST https://www.contract10.com/api/v1/extract \
  -H "Authorization: Bearer c10_live_..." \
  -F "file=@142-willow-creek-purchase-agreement.pdf" \
  -F "buildTimeline=true"
GET

/api/v1/transactions

Requires a live key

List the caller's own transactions, newest first.

request

curl https://www.contract10.com/api/v1/transactions \
  -H "Authorization: Bearer c10_live_..."
GET

/api/v1/transactions/{id}

Requires a live key

Get one transaction with its extracted fields and computed deadlines.

request

curl https://www.contract10.com/api/v1/transactions/4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e \
  -H "Authorization: Bearer c10_live_..."
GET

/api/v1/transactions/{id}/deadlines

Requires a live key

Just the deadlines for one transaction, sorted by due date.

request

curl https://www.contract10.com/api/v1/transactions/4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e/deadlines \
  -H "Authorization: Bearer c10_live_..."
GET

/api/v1/pricing

No key needed

Machine-readable plans: quotas, seats and per-call overage, generated from the same table the pricing page renders.

request

curl https://www.contract10.com/api/v1/pricing

Contract10 computes deadlines from the contract you upload. It is not legal advice and it does not replace your broker's review. Automated extraction can misread a poor scan, so every extracted field cites the page it came from and every deadline shows the arithmetic behind it. Confirm against the executed contract before you rely on a date.

Full API reference MCP server setup

API access is a Pro or Scale feature

POST /timeline is free and keyless, always. A c10_test_ key is free on every plan and runs the real engine, throttled, and never bills, so you can build against the whole surface before you pay for anything. A live c10_live_ key for /extract and the transaction endpoints needs Pro or Scale. See /api/v1/pricing for the machine-readable version.

See plans & quotas