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.
/api/v1/timeline
Key optionalThe 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"}]}'/api/v1/extract
Requires a live keyContract 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"
/api/v1/transactions
Requires a live keyList the caller's own transactions, newest first.
request
curl https://www.contract10.com/api/v1/transactions \ -H "Authorization: Bearer c10_live_..."
/api/v1/transactions/{id}
Requires a live keyGet 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_..."
/api/v1/transactions/{id}/deadlines
Requires a live keyJust 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_..."
/api/v1/pricing
No key neededMachine-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.
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