Reference
API reference
Every endpoint, field key and error code below is generated from the same modules the API imports, so this page cannot say something the code does not do. Machine-readable versions: /api/openapi and /llms.txt.
Base URL
https://www.contract10.com/api/v1
Auth
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.
Idempotency
Send an `Idempotency-Key` header on any POST to make retries safe: replaying the same key returns the original response instead of re-running the call.
Tracing
Every response carries `X-Request-Id`. Every keyed call is written to the inspectable request log in Settings.
Response envelope
Every success is { data }. This is the real response to the request example under POST /timeline below, the deterministic half computed by the actual engine, not a hand-typed sample.
200 response
{
"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"
}
}Field catalogue
Every field key the engine understands
The extractor targets exactly these keys, the review UI renders exactly these labels, and POST /timeline accepts exactly these keys in fields[]. A period outside its max is dropped with a reason, never clamped.
| key | label | unit | max | required | what to look for |
|---|---|---|---|---|---|
| acceptance_date | Acceptance date | date | n/a | yes | The date the last party signed. Also called the effective date, the date of ratification, or mutual acceptance. Every other period counts from this. |
| closing_date | Closing date | date | n/a | no | The stated settlement date or close of escrow, when the contract gives an actual date. |
| closing_days | Closing period | days | 365 | no | Used when the contract says closing happens N days after acceptance rather than naming a date. |
| earnest_money_days | Earnest money deadline | days | 60 | no | Days to deliver the deposit to escrow. |
| earnest_money_amount | Earnest money amount | usd | n/a | no | The deposit amount in dollars. |
| inspection_period_days | Inspection period | days | 120 | no | The inspection, due-diligence or option period. In Texas this is the option period; in Georgia, due diligence. |
| inspection_objection_days | Inspection objection period | days | 120 | no | Where the form separates inspecting from objecting, the deadline to deliver the objection or repair request. |
| appraisal_days | Appraisal contingency | days | 180 | no | Days for the appraisal contingency. |
| loan_approval_days | Financing contingency | days | 180 | no | Days for loan approval or the financing contingency. |
| title_review_days | Title review | days | 120 | no | Days to review and object to the title commitment. |
| seller_disclosure_days | Seller disclosures | days | 90 | no | Days for the seller to deliver disclosures. |
| contingency_removal_days | Contingency removal | days | 180 | no | Deadline to remove all remaining contingencies in writing. |
| final_walkthrough_days | Final walkthrough | days | 30 | no | Days BEFORE closing for the walkthrough. Counted backward from the closing date. |
| possession_date | Possession | date | n/a | no | When the buyer takes possession, if it differs from closing. |
Errors
Structured, never silent
Every non-2xx response is JSON, never a fabricated fallback. The code is stable; build on it, not on the message text.
| code | status | meaning |
|---|---|---|
| invalid_request | 400 | A required field is missing, malformed, or outside its plausible range (see the field catalogue's max column). The offending key is named in `details`. |
| unauthorized | 401 | The Authorization header is missing a valid, unrevoked API key for an endpoint that requires one. |
| upgrade_required | 402 | The Free plan has no live API/MCP access. Use a c10_test_ key to keep developing, or upgrade for a c10_live_ key. |
| not_found | 404 | No transaction exists for the given id, or it belongs to a different owner. |
| payload_too_large | 413 | The uploaded contract exceeds the size limit. |
| unsupported_media_type | 415 | Only PDF contracts are supported by /extract right now. |
| unprocessable | 422 | The file could not be read as a real-estate purchase contract, or was too degraded to extract reliably. Never a fabricated fallback. |
| conflict | 409 | This Idempotency-Key was already used for a DIFFERENT request. Replaying would return the earlier contract's dates, so it is refused. Use a new key for a new contract; resend the identical request to replay its response. |
| rate_limited | 429 | You exceeded your plan's per-minute burst rate, the test-key throttle, or the anonymous daily cap. See the quota table below. |
| not_configured | 503 | A required backend credential is not configured on our side. |
| upstream_unavailable | 502 | The extraction backend did not respond correctly. Safe to retry with backoff. |
| upstream_timeout | 504 | The extraction backend did not respond in time. Safe to retry with backoff. |
| internal | 500 | An unexpected server error. Safe to retry; contact support if it persists. |
400, a genuinely bad period
{
"error": {
"code": "invalid_request",
"message": "Inspection period of 1700 days is outside the plausible range (max 120). This is usually a page number read as a period.",
"details": {
"key": "inspection_period_days"
}
}
}Rate limits
By key type
POST /timeline and GET /pricing work with no key, throttled. Everything else needs a key: a free c10_test_ key runs the real engine and never bills, a c10_live_ key needs a Pro or Scale plan.
| Tier | Per minute | Per day | Volume |
|---|---|---|---|
| Anonymous (/timeline, /pricing only) | 4/min | 20/day | No live key, no /extract or /transactions access |
| Test key (any plan, c10_test_) | 10/min | 200/day | Full API surface against the real engine, never bills |
| Free plan | n/a | n/a | No live API key. 1 active transaction on the web app. |
| Pro (c10_live_) | 60/min | n/a | 1,000 calls/mo included, then $0.05/call |
| Scale (c10_live_) | 300/min | n/a | 10,000 calls/mo included, then $0.03/call |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, so an agent can back off before it gets a 429, and a 429 adds Retry-After. A keyed request also carries X-Quota-Limit, X-Quota-Used and X-Quota-Remaining for the monthly allowance. An anonymous caller has no account, so there is no monthly quota to report. Full plan details at /pricing or the machine-readable /api/v1/pricing.
Endpoints
Every route
/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.
| Param | In | Required | Description |
|---|---|---|---|
| fields | body | yes | ContractField[]. A minimal entry is { key, value }; the API fills in label, unit, page (0, meaning typed rather than read) and confidence ("high"). See the field catalogue below for every key. |
| options.dayZero | body | no | "acceptance" | "day_after_acceptance" (default). Whether the day of acceptance itself counts as day 1, or the day after does. Most contracts mean the latter. |
| options.extraHolidays | body | no | yyyy-mm-dd[]. Extra dates (a state holiday, an office closure) treated as non-business days on top of the computed US federal holidays. |
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
{
"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"
}
}/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.
| Param | In | Required | Description |
|---|---|---|---|
| file | body | no | multipart/form-data field with the PDF. |
| url | body | no | JSON body alternative to file: an https:// URL to fetch the PDF from. |
| base64 | body | no | JSON body alternative to file: base64-encoded PDF bytes. |
| buildTimeline | body | no | Boolean, default false. When true, also runs the extracted fields through the same deterministic engine as /timeline and returns the result as `timeline`. |
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"
response
{
"data": {
"transactionId": "4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e",
"fields": [
{
"key": "acceptance_date",
"label": "Acceptance date",
"unit": "date",
"value": "2026-08-03",
"valueText": null,
"dayBasis": null,
"page": 1,
"quote": "This Agreement is entered into and becomes effective (\"Effective Date\") on August 3, 2026.",
"confidence": "high"
},
{
"key": "closing_date",
"label": "Closing date",
"unit": "date",
"value": "2026-09-02",
"valueText": null,
"dayBasis": null,
"page": 4,
"quote": "Closing shall occur on or before September 2, 2026.",
"confidence": "high"
},
{
"key": "earnest_money_days",
"label": "Earnest money deadline",
"unit": "days",
"value": "3",
"valueText": "3 days",
"dayBasis": null,
"page": 2,
"quote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
"confidence": "high"
},
{
"key": "earnest_money_amount",
"label": "Earnest money amount",
"unit": "usd",
"value": "8500",
"valueText": "$8,500.00",
"dayBasis": null,
"page": 2,
"quote": "Earnest Money: $8,500.00",
"confidence": "high"
},
{
"key": "inspection_period_days",
"label": "Inspection period",
"unit": "days",
"value": "10",
"valueText": "10 days",
"dayBasis": null,
"page": 6,
"quote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
"confidence": "high"
},
{
"key": "appraisal_days",
"label": "Appraisal contingency",
"unit": "days",
"value": "17",
"valueText": "1[illegible]7",
"dayBasis": null,
"page": 9,
"quote": "Appraisal Contingency Period: 1[illegible]7 days.",
"confidence": "low"
}
],
"timeline": {
"acceptanceDate": "2026-08-03",
"closingDate": "2026-09-02",
"deadlines": [
{
"key": "earnest_money",
"label": "Earnest money due",
"dueDate": "2026-08-06",
"baseKey": "acceptance_date",
"baseDate": "2026-08-03",
"offsetDays": 3,
"dayBasis": "business",
"rollRule": "forward",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Aug 3, 2026 (acceptance) plus 3 business days = Aug 6, 2026. Deposit must be delivered to escrow.",
"sourceField": "earnest_money_days",
"sourcePage": 2,
"sourceQuote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
"needsVerify": false,
"group": "money"
},
{
"key": "inspection",
"label": "Inspection period ends",
"dueDate": "2026-08-13",
"baseKey": "acceptance_date",
"baseDate": "2026-08-03",
"offsetDays": 10,
"dayBasis": "calendar",
"rollRule": "forward",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Aug 3, 2026 (acceptance) plus 10 calendar days = Aug 13, 2026. Last day to complete inspections.",
"sourceField": "inspection_period_days",
"sourcePage": 6,
"sourceQuote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
"needsVerify": false,
"group": "diligence"
},
{
"key": "appraisal",
"label": "Appraisal contingency ends",
"dueDate": "2026-08-20",
"baseKey": "acceptance_date",
"baseDate": "2026-08-03",
"offsetDays": 17,
"dayBasis": "calendar",
"rollRule": "forward",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Aug 3, 2026 (acceptance) plus 17 calendar days = Aug 20, 2026. Last day to act on a low appraisal.",
"sourceField": "appraisal_days",
"sourcePage": 9,
"sourceQuote": "Appraisal Contingency Period: 1[illegible]7 days.",
"needsVerify": true,
"group": "financing"
},
{
"key": "closing",
"label": "Closing",
"dueDate": "2026-09-02",
"baseKey": "closing_date",
"baseDate": "2026-09-02",
"offsetDays": 0,
"dayBasis": "calendar",
"rollRule": "none",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Stated in the contract as Sep 2, 2026. Not derived from another date.",
"sourceField": "closing_date",
"sourcePage": 4,
"sourceQuote": "Closing shall occur on or before September 2, 2026.",
"needsVerify": false,
"group": "closing"
}
],
"warnings": [
{
"code": "low_confidence_field",
"message": "\"Appraisal contingency\" was read with low confidence from page 9. Confirm it against the contract before relying on appraisal contingency ends.",
"field": "appraisal_days"
}
],
"holidaysInWindow": [],
"engineVersion": "1.0.0"
},
"pageCount": 22,
"engine": "openrouter",
"confidence": 0.86
}
}/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_..."
response
{
"data": [
{
"id": "4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e",
"source": "api",
"status": "completed",
"needsReview": true,
"propertyAddress": "142 Willow Creek Dr, Austin, TX 78745",
"transactionType": "purchase",
"stateCode": "TX",
"contractName": "TREC 20",
"buyerRef": "J. Alvarez",
"sellerRef": "M. Chen",
"acceptanceDate": "2026-08-03",
"closingDate": "2026-09-02",
"archived": false,
"fileName": "142-willow-creek-purchase-agreement.pdf",
"fileSize": 1834213,
"pageCount": 22,
"fieldCount": 6,
"deadlineCount": 4,
"confidence": 0.86,
"engine": "openrouter",
"engineVersion": "1.0.0",
"createdAt": "2026-08-04T15:12:03Z",
"updatedAt": "2026-08-04T15:12:07Z",
"completedAt": "2026-08-04T15:12:07Z"
}
]
}/api/v1/transactions/{id}
Requires a live keyGet one transaction with its extracted fields and computed deadlines.
| Param | In | Required | Description |
|---|---|---|---|
| id | path | yes | Transaction id returned by POST /extract. |
request
curl https://www.contract10.com/api/v1/transactions/4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e \ -H "Authorization: Bearer c10_live_..."
response
{
"data": {
"transaction": {
"id": "4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e",
"source": "api",
"status": "completed",
"needsReview": true,
"propertyAddress": "142 Willow Creek Dr, Austin, TX 78745",
"transactionType": "purchase",
"stateCode": "TX",
"contractName": "TREC 20",
"buyerRef": "J. Alvarez",
"sellerRef": "M. Chen",
"acceptanceDate": "2026-08-03",
"closingDate": "2026-09-02",
"archived": false,
"fileName": "142-willow-creek-purchase-agreement.pdf",
"fileSize": 1834213,
"pageCount": 22,
"fieldCount": 6,
"deadlineCount": 4,
"confidence": 0.86,
"engine": "openrouter",
"engineVersion": "1.0.0",
"createdAt": "2026-08-04T15:12:03Z",
"updatedAt": "2026-08-04T15:12:07Z",
"completedAt": "2026-08-04T15:12:07Z"
},
"fields": [
{
"key": "acceptance_date",
"label": "Acceptance date",
"unit": "date",
"value": "2026-08-03",
"valueText": null,
"dayBasis": null,
"page": 1,
"quote": "This Agreement is entered into and becomes effective (\"Effective Date\") on August 3, 2026.",
"confidence": "high"
},
{
"key": "closing_date",
"label": "Closing date",
"unit": "date",
"value": "2026-09-02",
"valueText": null,
"dayBasis": null,
"page": 4,
"quote": "Closing shall occur on or before September 2, 2026.",
"confidence": "high"
},
{
"key": "earnest_money_days",
"label": "Earnest money deadline",
"unit": "days",
"value": "3",
"valueText": "3 days",
"dayBasis": null,
"page": 2,
"quote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
"confidence": "high"
},
{
"key": "earnest_money_amount",
"label": "Earnest money amount",
"unit": "usd",
"value": "8500",
"valueText": "$8,500.00",
"dayBasis": null,
"page": 2,
"quote": "Earnest Money: $8,500.00",
"confidence": "high"
},
{
"key": "inspection_period_days",
"label": "Inspection period",
"unit": "days",
"value": "10",
"valueText": "10 days",
"dayBasis": null,
"page": 6,
"quote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
"confidence": "high"
},
{
"key": "appraisal_days",
"label": "Appraisal contingency",
"unit": "days",
"value": "17",
"valueText": "1[illegible]7",
"dayBasis": null,
"page": 9,
"quote": "Appraisal Contingency Period: 1[illegible]7 days.",
"confidence": "low"
}
],
"deadlines": [
{
"key": "earnest_money",
"label": "Earnest money due",
"dueDate": "2026-08-06",
"baseKey": "acceptance_date",
"baseDate": "2026-08-03",
"offsetDays": 3,
"dayBasis": "business",
"rollRule": "forward",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Aug 3, 2026 (acceptance) plus 3 business days = Aug 6, 2026. Deposit must be delivered to escrow.",
"sourceField": "earnest_money_days",
"sourcePage": 2,
"sourceQuote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
"needsVerify": false,
"group": "money"
},
{
"key": "inspection",
"label": "Inspection period ends",
"dueDate": "2026-08-13",
"baseKey": "acceptance_date",
"baseDate": "2026-08-03",
"offsetDays": 10,
"dayBasis": "calendar",
"rollRule": "forward",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Aug 3, 2026 (acceptance) plus 10 calendar days = Aug 13, 2026. Last day to complete inspections.",
"sourceField": "inspection_period_days",
"sourcePage": 6,
"sourceQuote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
"needsVerify": false,
"group": "diligence"
},
{
"key": "appraisal",
"label": "Appraisal contingency ends",
"dueDate": "2026-08-20",
"baseKey": "acceptance_date",
"baseDate": "2026-08-03",
"offsetDays": 17,
"dayBasis": "calendar",
"rollRule": "forward",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Aug 3, 2026 (acceptance) plus 17 calendar days = Aug 20, 2026. Last day to act on a low appraisal.",
"sourceField": "appraisal_days",
"sourcePage": 9,
"sourceQuote": "Appraisal Contingency Period: 1[illegible]7 days.",
"needsVerify": true,
"group": "financing"
},
{
"key": "closing",
"label": "Closing",
"dueDate": "2026-09-02",
"baseKey": "closing_date",
"baseDate": "2026-09-02",
"offsetDays": 0,
"dayBasis": "calendar",
"rollRule": "none",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Stated in the contract as Sep 2, 2026. Not derived from another date.",
"sourceField": "closing_date",
"sourcePage": 4,
"sourceQuote": "Closing shall occur on or before September 2, 2026.",
"needsVerify": false,
"group": "closing"
}
]
}
}/api/v1/transactions/{id}/deadlines
Requires a live keyJust the deadlines for one transaction, sorted by due date.
| Param | In | Required | Description |
|---|---|---|---|
| id | path | yes | Transaction id. |
request
curl https://www.contract10.com/api/v1/transactions/4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e/deadlines \ -H "Authorization: Bearer c10_live_..."
response
{
"data": [
{
"key": "earnest_money",
"label": "Earnest money due",
"dueDate": "2026-08-06",
"baseKey": "acceptance_date",
"baseDate": "2026-08-03",
"offsetDays": 3,
"dayBasis": "business",
"rollRule": "forward",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Aug 3, 2026 (acceptance) plus 3 business days = Aug 6, 2026. Deposit must be delivered to escrow.",
"sourceField": "earnest_money_days",
"sourcePage": 2,
"sourceQuote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
"needsVerify": false,
"group": "money"
},
{
"key": "inspection",
"label": "Inspection period ends",
"dueDate": "2026-08-13",
"baseKey": "acceptance_date",
"baseDate": "2026-08-03",
"offsetDays": 10,
"dayBasis": "calendar",
"rollRule": "forward",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Aug 3, 2026 (acceptance) plus 10 calendar days = Aug 13, 2026. Last day to complete inspections.",
"sourceField": "inspection_period_days",
"sourcePage": 6,
"sourceQuote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
"needsVerify": false,
"group": "diligence"
},
{
"key": "appraisal",
"label": "Appraisal contingency ends",
"dueDate": "2026-08-20",
"baseKey": "acceptance_date",
"baseDate": "2026-08-03",
"offsetDays": 17,
"dayBasis": "calendar",
"rollRule": "forward",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Aug 3, 2026 (acceptance) plus 17 calendar days = Aug 20, 2026. Last day to act on a low appraisal.",
"sourceField": "appraisal_days",
"sourcePage": 9,
"sourceQuote": "Appraisal Contingency Period: 1[illegible]7 days.",
"needsVerify": true,
"group": "financing"
},
{
"key": "closing",
"label": "Closing",
"dueDate": "2026-09-02",
"baseKey": "closing_date",
"baseDate": "2026-09-02",
"offsetDays": 0,
"dayBasis": "calendar",
"rollRule": "none",
"rolledFrom": null,
"rolledReason": null,
"derivation": "Stated in the contract as Sep 2, 2026. Not derived from another date.",
"sourceField": "closing_date",
"sourcePage": 4,
"sourceQuote": "Closing shall occur on or before September 2, 2026.",
"needsVerify": false,
"group": "closing"
}
]
}/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
response
{
"data": {
"plans": [
{
"id": "free",
"name": "Free",
"priceUsd": 0,
"cadence": "free forever",
"activeTransactions": 1,
"apiCallsPerMonth": 0,
"apiPerMinute": 0,
"seats": 1,
"overageUsd": 0,
"features": [
"1 active transaction",
"Full contract extraction with page citations",
"Every deadline shows its derivation",
"Deadline checklist you tick off yourself",
"Free in-browser timeline calculator, always",
"Test API key for developers (throttled, never bills)"
]
},
{
"id": "pro",
"name": "Pro",
"priceUsd": 49,
"cadence": "per month",
"activeTransactions": null,
"apiCallsPerMonth": 1000,
"apiPerMinute": 60,
"seats": 1,
"overageUsd": 0.05,
"features": [
"Unlimited active transactions",
"iCal and CSV export, no watermark",
"Closing timeline API + MCP server (1,000 calls/mo)",
"Inspectable request log"
]
},
{
"id": "scale",
"name": "Scale",
"priceUsd": 199,
"cadence": "per month",
"activeTransactions": null,
"apiCallsPerMonth": 10000,
"apiPerMinute": 300,
"seats": 1,
"overageUsd": 0.03,
"features": [
"Everything in Pro",
"10,000 API calls/mo, then $0.03 each",
"300 requests/minute burst",
"Hosted MCP at production quota",
"Priority support"
]
}
],
"anonQuota": {
"perMinute": 4,
"perDay": 20
},
"testKeyQuota": {
"perMinute": 10,
"perDay": 200
}
}
}/api/openapi
No key neededThe full OpenAPI 3.1 document for every /api/v1 route above, for agents and codegen that want a typed client instead of reading this page.
request
curl https://www.contract10.com/api/openapi
response
{ "openapi": "3.1.0", "info": { "title": "Contract10 API", "version": "1" }, "paths": { "/timeline": { "...": "..." } } }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.